/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/msgcntr/trunk/messageforums-app/src/java/org/sakaiproject/tool/messageforums/ui/MessageForumsSynopticBean.java $ * $Id: MessageForumsSynopticBean.java $ *********************************************************************************** * * Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009 The Sakai Foundation * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **********************************************************************************/ package org.sakaiproject.tool.messageforums.ui; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.TreeMap; import javax.faces.application.FacesMessage; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.faces.event.ValueChangeEvent; import javax.faces.model.SelectItem; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.api.app.messageforums.Attachment; import org.sakaiproject.api.app.messageforums.DiscussionForum; import org.sakaiproject.api.app.messageforums.DiscussionForumService; import org.sakaiproject.api.app.messageforums.DiscussionTopic; import org.sakaiproject.api.app.messageforums.MembershipManager; import org.sakaiproject.api.app.messageforums.Message; import org.sakaiproject.api.app.messageforums.MessageForumsMessageManager; import org.sakaiproject.api.app.messageforums.Topic; import org.sakaiproject.api.app.messageforums.UserStatistics; import org.sakaiproject.api.app.messageforums.ui.DiscussionForumManager; import org.sakaiproject.api.app.messageforums.ui.UIPermissionsManager; import org.sakaiproject.authz.api.Member; import org.sakaiproject.component.app.messageforums.MembershipItem; import org.sakaiproject.component.cover.ComponentManager; import org.sakaiproject.component.cover.ServerConfigurationService; import org.sakaiproject.event.cover.EventTrackingService; import org.sakaiproject.exception.IdUnusedException; import org.sakaiproject.service.gradebook.shared.Assignment; import org.sakaiproject.service.gradebook.shared.GradeDefinition; import org.sakaiproject.service.gradebook.shared.GradebookService; import org.sakaiproject.site.api.Group; import org.sakaiproject.site.api.Site; import org.sakaiproject.site.cover.SiteService; import org.sakaiproject.tool.cover.SessionManager; import org.sakaiproject.tool.cover.ToolManager; import org.sakaiproject.user.api.User; import org.sakaiproject.user.api.UserNotDefinedException; import org.sakaiproject.user.cover.UserDirectoryService; import org.sakaiproject.util.ResourceLoader; public class MessageForumStatisticsBean { /** * Used to store Statistic information on message forum per * per user */ public class DecoratedCompiledMessageStatistics { private String siteName; private String siteId; private String siteUser; private String siteUserId; private int authoredForumsAmt; private int readForumsAmt; private int unreadForumsAmt; private Double percentReadForumsAmt; private DecoratedGradebookAssignment gradebookAssignment; public String getSiteName(){ return this.siteName; } public void setSiteName(String newValue){ this.siteName = newValue; } public String getSiteId(){ return this.siteId; } public void setSiteId(String newValue){ this.siteId = newValue; } public String getSiteUser(){ return this.siteUser; } public void setSiteUser(String newValue){ this.siteUser = newValue; } public String getEscapedSiteUser(){ return this.siteUser.replaceAll("'", "\\\\'"); } public String getSiteUserId(){ return this.siteUserId; } public void setSiteUserId(String newValue){ this.siteUserId = newValue; } public int getAuthoredForumsAmt(){ return this.authoredForumsAmt; } public void setAuthoredForumsAmt(int newValue){ this.authoredForumsAmt = newValue; } public int getReadForumsAmt(){ return this.readForumsAmt; } public void setReadForumsAmt(int newValue){ this.readForumsAmt = newValue; } public int getUnreadForumsAmt(){ return this.unreadForumsAmt; } public void setUnreadForumsAmt(int newValue){ this.unreadForumsAmt = newValue; } public Double getPercentReadForumsAmt(){ return this.percentReadForumsAmt; } public void setPercentReadFOrumsAmt(Double newValue){ this.percentReadForumsAmt = newValue; } public DecoratedGradebookAssignment getGradebookAssignment() { return gradebookAssignment; } public void setGradebookAssignment( DecoratedGradebookAssignment gradebookAssignment) { this.gradebookAssignment = gradebookAssignment; } } /* === End DecoratedCompiledMessageStatistics === */ public class DecoratedGradebookAssignment{ private String userUuid; private String name; private String score; private String comment; private String pointsPossible; private boolean allowedToGrade = false; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getScore() { return score; } public void setScore(String score) { this.score = score; } public String getComment() { return comment; } public void setComment(String comment) { this.comment = comment; } public String getPointsPossible() { return pointsPossible; } public void setPointsPossible(String pointsPossible) { this.pointsPossible = pointsPossible; } public boolean isAllowedToGrade() { return allowedToGrade; } public void setAllowedToGrade(boolean allowedToGrade) { this.allowedToGrade = allowedToGrade; } public String getUserUuid() { return userUuid; } public void setUserUuid(String userUuid) { this.userUuid = userUuid; } } public class DecoratedCompiledStatisticsByTopic{ private Long topicId; private Long forumId; private String forumTitle; private String topicTitle; private Date forumDate; private Date topicDate; private int authoredForumsAmt; private int totalTopicMessages; private int unreadTopicMessages; private Double percentReadForumsAmt; private DecoratedGradebookAssignment gradebookAssignment; public String getForumTitle() { return forumTitle; } public void setForumTitle(String forumTitle) { this.forumTitle = forumTitle; } public String getTopicTitle() { return topicTitle; } public void setTopicTitle(String topicTitle) { this.topicTitle = topicTitle; } public Date getForumDate() { return forumDate; } public void setForumDate(Date forumDate) { this.forumDate = forumDate; } public int getAuthoredForumsAmt() { return authoredForumsAmt; } public void setAuthoredForumsAmt(int authoredForumsAmt) { this.authoredForumsAmt = authoredForumsAmt; } public Double getPercentReadForumsAmt() { return percentReadForumsAmt; } public void setPercentReadForumsAmt(Double percentReadForumsAmt) { this.percentReadForumsAmt = percentReadForumsAmt; } public int getTotalTopicMessages() { return totalTopicMessages; } public void setTotalTopicMessages(int totalTopicMessages) { this.totalTopicMessages = totalTopicMessages; } public int getUnreadTopicMessages() { return unreadTopicMessages; } public void setUnreadTopicMessages(int unreadTopicMessages) { this.unreadTopicMessages = unreadTopicMessages; } public Date getTopicDate() { return topicDate; } public void setTopicDate(Date topicDate) { this.topicDate = topicDate; } public Long getTopicId() { return topicId; } public void setTopicId(Long topicId) { this.topicId = topicId; } public Long getForumId() { return forumId; } public void setForumId(Long forumId) { this.forumId = forumId; } public DecoratedGradebookAssignment getGradebookAssignment() { return gradebookAssignment; } public void setGradebookAssignment( DecoratedGradebookAssignment gradebookAssignment) { this.gradebookAssignment = gradebookAssignment; } } /** Decorated Bean to store stats for user **/ public DecoratedCompiledMessageStatistics userInfo = null; public UserStatistics userAuthoredInfo = null; private Map courseMemberMap; protected boolean ascending = true; protected boolean ascendingForUser = false; protected boolean ascendingForUser2 = false; protected boolean ascendingForUser3 = false; protected boolean ascendingForAllTopics = false; protected String sortBy = NAME_SORT; protected String sortByUser = FORUM_DATE_SORT; protected String sortByUser2 = FORUM_DATE_SORT2; protected String sortByUser3 = FORUM_DATE_SORT3; protected String sortByAllTopics = ALL_TOPICS_FORUM_TITLE_SORT; private static final String LIST_PAGE = "dfStatisticsList"; private static final String NAME_SORT = "sort_by_name"; private static final String AUTHORED_SORT = "sort_by_num_authored"; private static final String READ_SORT = "sort_by_num_read"; private static final String UNREAD_SORT = "sort_by_num_unread"; private static final String PERCENT_READ_SORT = "sort_by_percent_read"; private static final String GRADE_SORT = "sort_by_grade"; private static final String SITE_USER_ID = "siteUserId"; private static final String SITE_USER = "siteUser"; private static final String FORUM_TITLE_SORT = "sort_by_forum_title"; private static final String TOPIC_TITLE_SORT = "sort_by_topic_title"; private static final String FORUM_DATE_SORT = "sort_by_forum_date"; private static final String FORUM_SUBJECT_SORT = "sort_by_forum_subject_2"; private static final String FORUM_TITLE_SORT2 = "sort_by_forum_title_2"; private static final String TOPIC_TITLE_SORT2 = "sort_by_topic_title_2"; private static final String FORUM_DATE_SORT2 = "sort_by_forum_date_2"; private static final String FORUM_SUBJECT_SORT2 = "sort_by_forum_subject_2"; private static final String FORUM_DATE_SORT3 = "sort_by_forum_date_3"; private static final String TOPIC_TITLE_SORT3 = "sort_by_forum_subject_3"; private static final String ALL_TOPICS_FORUM_TITLE_SORT = "sort_by_all_topics_forum_title"; private static final String ALL_TOPICS_FORUM_DATE_SORT = "sort_by_all_topics_forum_date"; private static final String ALL_TOPICS_TOPIC_DATE_SORT = "sort_by_all_topics_topic_date"; private static final String ALL_TOPICS_TOPIC_TITLE_SORT = "sort_by_all_topics_topic_title"; private static final String ALL_TOPICS_TOPIC_TOTAL_MESSAGES_SORT = "sort_by_all_topics_topic_total_messages"; private static final String TOPIC_ID = "topicId"; private static final String FORUM_ID = "forumId"; private static final String TOPIC_TITLE = "topicTitle"; private static final String FORUM_TITLE = "forumTitle"; private static final String MESSAGECENTER_BUNDLE = "org.sakaiproject.api.app.messagecenter.bundle.Messages"; private static final String FORUM_STATISTICS = "dfStatisticsList"; private static final String FORUM_STATISTICS_BY_ALL_TOPICS = "dfStatisticsListByAllTopics"; private static final String FORUM_STATISTICS_BY_TOPIC = "dfStatisticsListByTopic"; private static final String FORUM_STATISTICS_USER = "dfStatisticsUser"; private static final String FORUM_STATISTICS_ALL_AUTHORED_MSG = "dfStatisticsAllAuthoredMessageForOneUser"; private static final String FORUM_STATISTICS_MSG = "dfStatisticsFullTextForOne"; public String selectedSiteUserId = null; public String selectedSiteUser = null; public String selectedMsgId= null; public String selectedMsgSubject= null; public String selectedForumTitle= null; public String selectedTopicTitle= null; public String selectedTopicId= null; public String selectedAllTopicsTopicId = null; public String selectedAllTopicsForumId = null; public String selectedAllTopicsTopicTitle = null; public String selectedAllTopicsForumTitle = null; private String buttonUserName; private boolean isFirstParticipant = false; private boolean isLastParticipant = false; //Comparatibles public static Comparator nameComparatorAsc; public static Comparator authoredComparatorAsc; public static Comparator readComparatorAsc; public static Comparator unreadComparatorAsc; public static Comparator percentReadComparatorAsc; public static Comparator GradeComparatorAsc; public static Comparator nameComparatorDesc; public static Comparator authoredComparatorDesc; public static Comparator readComparatorDesc; public static Comparator unreadComparatorDesc; public static Comparator percentReadComparatorDesc; public static Comparator dateComparaterDesc; public static Comparator GradeComparatorDesc; public static Comparator forumTitleComparatorAsc; public static Comparator forumTitleComparatorDesc; public static Comparator topicTitleComparatorAsc; public static Comparator topicTitleComparatorDesc; public static Comparator forumDateComparatorAsc; public static Comparator forumDateComparatorDesc; public static Comparator forumSubjectComparatorAsc; public static Comparator forumSubjectComparatorDesc; public static Comparator AllTopicsForumDateComparatorAsc; public static Comparator AllTopicsTopicDateComparatorAsc; public static Comparator AllTopicsTopicTitleComparatorAsc; public static Comparator AllTopicsTopicTotalMessagesComparatorAsc; public static Comparator AllTopicsForumTitleComparatorAsc; public static Comparator AllTopicsForumDateComparatorDesc; public static Comparator AllTopicsTopicDateComparatorDesc; public static Comparator AllTopicsTopicTitleComparatorDesc; public static Comparator AllTopicsTopicTotalMessagesComparatorDesc; public static Comparator AllTopicsForumTitleComparatorDesc; private static final String DEFAULT_GB_ITEM = "Default_0"; private static final String DEFAULT_ALL_GROUPS = "all_participants_desc"; private static final String SELECT_ASSIGN = "stat_forum_no_gbitem"; private boolean gradebookExistChecked = false; private boolean gradebookExist = false; private List<SelectItem> assignments = null; private List<SelectItem> groups = null; private String selectedAssign = DEFAULT_GB_ITEM; private String selectedGroup = DEFAULT_GB_ITEM; private boolean gradebookItemChosen = false; private String selAssignName; private String gbItemPointsPossible; private boolean gradeByPoints; private boolean gradeByPercent; private boolean gradeByLetter; private List<DecoratedCompiledMessageStatistics> gradeStatistics = null; private static final String NO_ASSGN = "cdfm_no_assign_for_grade"; private static final String ALERT = "cdfm_alert"; private static final String GRADE_SUCCESSFUL = "cdfm_grade_successful"; private static final String GRADE_GREATER_ZERO = "cdfm_grade_greater_than_zero"; private static final String GRADE_DECIMAL_WARN = "cdfm_grade_decimal_warn"; private static final String GRADE_INVALID_GENERIC = "cdfm_grade_invalid_warn"; public Map getCourseMemberMap(){ return this.courseMemberMap; } public void setCourseMemberMap(Map newValue){ this.courseMemberMap = newValue; } /** to get accces to log file */ private static final Log LOG = LogFactory.getLog(MessageForumSynopticBean.class); /** Needed if within a site so we only need stats for this site */ private MessageForumsMessageManager messageManager; /** Needed to get topics if tool within a site */ private DiscussionForumManager forumManager; private MembershipManager membershipManager; /** Needed to determine if user has read permission of topic */ private UIPermissionsManager uiPermissionsManager; public void setMessageManager(MessageForumsMessageManager messageManager){ this.messageManager = messageManager; } public void setForumManager(DiscussionForumManager forumManager){ this.forumManager = forumManager; } public String getSelectedSiteUserId(){ return this.selectedSiteUserId; } public String getSelectedSiteUser(){ return this.selectedSiteUser; } public void setUiPermissionsManager(UIPermissionsManager uiPermissionsManager){ this.uiPermissionsManager = uiPermissionsManager; } public void setMembershipManager(MembershipManager membershipManager) { this.membershipManager = membershipManager; } public DecoratedCompiledMessageStatistics getUserInfo() { return userInfo; } public void setUserInfo(DecoratedCompiledMessageStatistics userInfo) { this.userInfo = userInfo; } public List getAllUserStatistics(){ selectedAllTopicsTopicId = null; selectedAllTopicsForumId = null; selectedAllTopicsForumTitle = null; selectedAllTopicsTopicTitle = null; //clear any gradebook info: resetGradebookVariables(); int totalForum = messageManager.findMessageCountTotal(); Map<String, DecoratedCompiledMessageStatistics> tmpStatistics = new TreeMap<String, DecoratedCompiledMessageStatistics>(); // process the returned read statistics for the students to get them sorted by user id List<Object[]> studentReadStats = messageManager.findReadMessageCountForAllStudents(); for (Object[] readStat: studentReadStats) { DecoratedCompiledMessageStatistics userStats = tmpStatistics.get(readStat[0]); if (userStats == null) { userStats = new DecoratedCompiledMessageStatistics(); tmpStatistics.put((String)readStat[0], userStats); } if (totalForum > 0) { userStats.setReadForumsAmt((Integer)readStat[1]); } else { userStats.setReadForumsAmt(0); } } // process the returned authored statistics for the students to get them sorted by user id List<Object[]> studentAuthoredStats = messageManager.findAuthoredMessageCountForAllStudents(); for (Object[] authoredStat: studentAuthoredStats) { DecoratedCompiledMessageStatistics userStats = tmpStatistics.get(authoredStat[0]); if (userStats == null) { userStats = new DecoratedCompiledMessageStatistics(); tmpStatistics.put((String)authoredStat[0], userStats); } if (totalForum > 0) { userStats.setAuthoredForumsAmt((Integer)authoredStat[1]); } else { userStats.setAuthoredForumsAmt(0); } } // now process the users from the list of site members to add display information // this will also prune the list of members so only the papropriate ones are displayed courseMemberMap = membershipManager.getAllCourseMembers(true,false,false,null); List members = membershipManager.convertMemberMapToList(courseMemberMap); final List<DecoratedCompiledMessageStatistics> statistics = new ArrayList<DecoratedCompiledMessageStatistics>(); for (Iterator i = members.iterator(); i.hasNext();) { MembershipItem item = (MembershipItem) i.next(); if (null != item.getUser()) { userInfo = tmpStatistics.get(item.getUser().getId()); if (userInfo == null) { userInfo = new DecoratedCompiledMessageStatistics(); userInfo.setReadForumsAmt(0); userInfo.setAuthoredForumsAmt(0); } userInfo.setSiteUserId(item.getUser().getId()); userInfo.setSiteUser(item.getName()); if (totalForum > 0) { userInfo.setUnreadForumsAmt(totalForum - userInfo.getReadForumsAmt()); userInfo.setPercentReadFOrumsAmt((double)userInfo.getReadForumsAmt() / (double)totalForum); } else { userInfo.setUnreadForumsAmt(0); userInfo.setPercentReadFOrumsAmt((double)0); } statistics.add(userInfo); } } sortStatistics(statistics); return statistics; } Map<String, List> userAuthoredStatisticsCache = new HashMap<String, List>(); public List getUserAuthoredStatistics(){ if(!userAuthoredStatisticsCache.containsKey(selectedSiteUserId)){ final List<UserStatistics> statistics = new ArrayList<UserStatistics>(); if((selectedAllTopicsTopicId == null || "".equals(selectedAllTopicsTopicId)) && (selectedAllTopicsForumId != null && !"".equals(selectedAllTopicsForumId))){ statistics.addAll(messageManager.findAuthoredStatsForStudentByForumId(selectedSiteUserId, Long.parseLong(selectedAllTopicsForumId))); }else if(selectedAllTopicsTopicId != null && !"".equals(selectedAllTopicsTopicId)){ statistics.addAll(messageManager.findAuthoredStatsForStudentByTopicId(selectedSiteUserId, Long.parseLong(selectedAllTopicsTopicId))); }else{ statistics.addAll(messageManager.findAuthoredStatsForStudent(selectedSiteUserId)); } sortStatisticsByUser(statistics); userAuthoredStatisticsCache.put(selectedSiteUserId, statistics); } else { // sort the statistics List<UserStatistics> statistics = userAuthoredStatisticsCache.get(selectedSiteUserId); sortStatisticsByUser(statistics); userAuthoredStatisticsCache.put(selectedSiteUserId, statistics); } return userAuthoredStatisticsCache.get(selectedSiteUserId); } public List getTopicStatistics(){ final List<DecoratedCompiledMessageStatistics> statistics = new ArrayList<DecoratedCompiledMessageStatistics>(); if((selectedAllTopicsTopicId != null && !"".equals(selectedAllTopicsTopicId)) || selectedAllTopicsForumId != null && !"".equals(selectedAllTopicsForumId)){ int totalForum = 0; if(selectedAllTopicsTopicId != null && !"".equals(selectedAllTopicsTopicId)){ totalForum = messageManager.findMessageCountByTopicId(Long.parseLong(selectedAllTopicsTopicId)); }else{ totalForum = messageManager.findMessageCountByForumId(Long.parseLong(selectedAllTopicsForumId)); } Map<String, DecoratedCompiledMessageStatistics> tmpStatistics = new TreeMap<String, DecoratedCompiledMessageStatistics>(); // process the returned read statistics for the students to get them sorted by user id List<Object[]> studentReadStats; if(selectedAllTopicsTopicId != null && !"".equals(selectedAllTopicsTopicId)){ studentReadStats = messageManager.findReadMessageCountForAllStudentsByTopicId(Long.parseLong(selectedAllTopicsTopicId)); }else{ studentReadStats = messageManager.findReadMessageCountForAllStudentsByForumId(Long.parseLong(selectedAllTopicsForumId)); } for (Object[] readStat: studentReadStats) { DecoratedCompiledMessageStatistics userStats = tmpStatistics.get(readStat[0]); if (userStats == null) { userStats = new DecoratedCompiledMessageStatistics(); tmpStatistics.put((String)readStat[0], userStats); } if (totalForum > 0) { userStats.setReadForumsAmt((Integer)readStat[1]); } else { userStats.setReadForumsAmt(0); } } // process the returned authored statistics for the students to get them sorted by user id List<Object[]> studentAuthoredStats; if(selectedAllTopicsTopicId != null && !"".equals(selectedAllTopicsTopicId)){ studentAuthoredStats = messageManager.findAuthoredMessageCountForAllStudentsByTopicId(Long.parseLong(selectedAllTopicsTopicId)); }else{ studentAuthoredStats = messageManager.findAuthoredMessageCountForAllStudentsByForumId(Long.parseLong(selectedAllTopicsForumId)); } for (Object[] authoredStat: studentAuthoredStats) { DecoratedCompiledMessageStatistics userStats = tmpStatistics.get(authoredStat[0]); if (userStats == null) { userStats = new DecoratedCompiledMessageStatistics(); tmpStatistics.put((String)authoredStat[0], userStats); } if (totalForum > 0) { userStats.setAuthoredForumsAmt((Integer)authoredStat[1]); } else { userStats.setAuthoredForumsAmt(0); } } // now process the users from the list of site members to add display information // this will also prune the list of members so only the papropriate ones are displayed courseMemberMap = membershipManager.getAllCourseMembers(true,false,false,null); Map convertedMap = convertMemberMapToUserIdMap(courseMemberMap); Map<String, DecoratedGradebookAssignment> studentGradesMap = getGradebookAssignment(); List<DecoratedUser> dUsers = new ArrayList(); if(!DEFAULT_GB_ITEM.equals(selectedGroup)){ try{ Site currentSite = SiteService.getSite(ToolManager.getCurrentPlacement().getContext()); if(currentSite.hasGroups()){ Group group = currentSite.getGroup(selectedGroup); for (Iterator i = group.getMembers().iterator(); i.hasNext();) { Member item = (Member) i.next(); if(convertedMap.containsKey(item.getUserId())){ MembershipItem memItem = (MembershipItem) convertedMap.get(item.getUserId()); if (null != memItem.getUser()) { dUsers.add(new DecoratedUser(memItem.getUser().getId(), memItem.getName())); } } } } }catch (IdUnusedException e) { LOG.error(e); } }else{ for (Iterator i = courseMemberMap.entrySet().iterator(); i.hasNext();) { Entry entry = (Entry) i.next(); MembershipItem item = (MembershipItem) entry.getValue(); if (null != item.getUser()) { dUsers.add(new DecoratedUser(item.getUser().getId(), item.getName())); } } } for (Iterator i = dUsers.iterator(); i.hasNext();) { DecoratedUser item = (DecoratedUser) i.next(); userInfo = tmpStatistics.get(item.getId()); if (userInfo == null) { userInfo = new DecoratedCompiledMessageStatistics(); userInfo.setReadForumsAmt(0); userInfo.setAuthoredForumsAmt(0); } userInfo.setSiteUserId(item.getId()); userInfo.setSiteUser(item.getName()); if (totalForum > 0) { userInfo.setUnreadForumsAmt(totalForum - userInfo.getReadForumsAmt()); userInfo.setPercentReadFOrumsAmt((double)userInfo.getReadForumsAmt() / (double)totalForum); } else { userInfo.setUnreadForumsAmt(0); userInfo.setPercentReadFOrumsAmt((double)0); } DecoratedGradebookAssignment decoGradeAssgn = studentGradesMap.get(item.getId()); if(decoGradeAssgn == null){ decoGradeAssgn = new DecoratedGradebookAssignment(); decoGradeAssgn.setAllowedToGrade(false); decoGradeAssgn.setUserUuid(item.getId()); } userInfo.setGradebookAssignment(decoGradeAssgn); statistics.add(userInfo); } sortStatistics(statistics); } gradeStatistics = statistics; return gradeStatistics; } private Map convertMemberMapToUserIdMap(Map origMap){ Map returnMap = new HashMap(); for (Iterator i = origMap.entrySet().iterator(); i.hasNext();) { Entry entry = (Entry) i.next(); MembershipItem item = (MembershipItem) entry.getValue(); if (null != item.getUser()) { returnMap.put(item.getUser().getId(), item); } } return returnMap; } public List getAllTopicStatistics(){ //clear any gradebook info: resetGradebookVariables(); final Map<Long, DecoratedCompiledStatisticsByTopic> statisticsMap = new HashMap<Long, DecoratedCompiledStatisticsByTopic>(); List<DiscussionForum> tempForums = forumManager.getForumsForMainPage(); Set<Long> topicIdsForCounts = new HashSet<Long>(); DecoratedCompiledStatisticsByTopic dCompiledStatsByTopic = null; //grab the info for forums and topics in the site for (DiscussionForum forum: tempForums) { for (Iterator itor = forum.getTopicsSet().iterator(); itor.hasNext(); ) { DiscussionTopic currTopic = (DiscussionTopic)itor.next(); dCompiledStatsByTopic = new DecoratedCompiledStatisticsByTopic(); dCompiledStatsByTopic.setForumDate(forum.getModified()); dCompiledStatsByTopic.setForumId(forum.getId()); dCompiledStatsByTopic.setTopicDate(currTopic.getModified()); dCompiledStatsByTopic.setForumTitle(forum.getTitle()); dCompiledStatsByTopic.setTopicTitle(currTopic.getTitle()); dCompiledStatsByTopic.setTopicId(currTopic.getId()); statisticsMap.put(currTopic.getId(), dCompiledStatsByTopic); topicIdsForCounts.add(currTopic.getId()); } } //get counts List<Object[]> topicMessageCounts = forumManager.getMessageCountsForMainPage(topicIdsForCounts); for (Object[] counts: topicMessageCounts) { dCompiledStatsByTopic = statisticsMap.get(counts[0]); if(dCompiledStatsByTopic != null){ dCompiledStatsByTopic.setTotalTopicMessages((Integer) counts[1]); } } final List<DecoratedCompiledStatisticsByTopic> statistics = new ArrayList(statisticsMap.values()); sortStatisticsByAllTopics(statistics); return statistics; } public List getUserAuthoredStatistics2(){ final List<UserStatistics> statistics = new ArrayList<UserStatistics>(); List<Message> messages; if((selectedAllTopicsTopicId == null || "".equals(selectedAllTopicsTopicId)) && (selectedAllTopicsForumId != null && !"".equals(selectedAllTopicsForumId))){ messages = messageManager.findAuthoredMessagesForStudentByForumId(selectedSiteUserId, Long.parseLong(selectedAllTopicsForumId)); }else if(selectedAllTopicsTopicId != null && !"".equals(selectedAllTopicsTopicId)){ messages = messageManager.findAuthoredMessagesForStudentByTopicId(selectedSiteUserId, Long.parseLong(selectedAllTopicsTopicId)); }else{ messages = messageManager.findAuthoredMessagesForStudent(selectedSiteUserId); } if (messages == null) return statistics; for (Message msg: messages) { Message mesWithAttach = (Message)messageManager.getMessageByIdWithAttachments(msg.getId()); List decoAttachList = new ArrayList(); List attachList = mesWithAttach.getAttachments(); if(attachList != null ) { for(int i=0; i<attachList.size(); i++) { DecoratedAttachment decoAttach = new DecoratedAttachment((Attachment)attachList.get(i)); decoAttachList.add(decoAttach); } } userAuthoredInfo = new UserStatistics(); userAuthoredInfo.setSiteUserId(selectedSiteUserId); userAuthoredInfo.setForumTitle(msg.getTopic().getOpenForum().getTitle()); userAuthoredInfo.setTopicTitle(msg.getTopic().getTitle()); userAuthoredInfo.setForumDate(msg.getCreated()); userAuthoredInfo.setForumSubject(msg.getTitle()); userAuthoredInfo.setMessage(msg.getBody()); userAuthoredInfo.setMsgId(Long.toString(msg.getId())); userAuthoredInfo.setTopicId(Long.toString(msg.getTopic().getId())); userAuthoredInfo.setForumId(Long.toString(msg.getTopic().getOpenForum().getId())); userAuthoredInfo.setMsgDeleted(msg.getDeleted()); userAuthoredInfo.setDecoAttachmentsList(decoAttachList); userAuthoredInfo.setMessage(msg.getBody()); messageManager.markMessageReadForUser(msg.getTopic().getId(), msg.getId(), true, getCurrentUserId()); statistics.add(userAuthoredInfo); } sortStatisticsByUser3(statistics); return statistics; } private String getCurrentUserId() { String currentUserId = SessionManager.getCurrentSessionUserId();; return currentUserId; } public List getUserSubjectMsgBody(){ final List statistics = new ArrayList(); if(selectedMsgId != null){ try{ Long msgId = Long.valueOf(selectedMsgId); Message mesWithAttach = (Message)messageManager.getMessageByIdWithAttachments(msgId); Topic t = forumManager.getTopicById(mesWithAttach.getTopic().getId()); DiscussionForum d = forumManager.getForumById(t.getOpenForum().getId()); List decoAttachList = new ArrayList(); List attachList = mesWithAttach.getAttachments(); if(attachList != null ) { for(int i=0; i<attachList.size(); i++) { DecoratedAttachment decoAttach = new DecoratedAttachment((Attachment)attachList.get(i)); decoAttachList.add(decoAttach); } } userAuthoredInfo = new UserStatistics(); userAuthoredInfo.setSiteUserId(selectedSiteUserId); userAuthoredInfo.setForumTitle(d.getTitle()); userAuthoredInfo.setTopicTitle(t.getTitle()); userAuthoredInfo.setForumDate(mesWithAttach.getCreated()); userAuthoredInfo.setForumSubject(mesWithAttach.getTitle()); userAuthoredInfo.setMessage(mesWithAttach.getBody()); userAuthoredInfo.setMsgId(selectedMsgId); userAuthoredInfo.setTopicId(Long.toString(t.getId())); userAuthoredInfo.setForumId(Long.toString(d.getId())); userAuthoredInfo.setMsgDeleted(mesWithAttach.getDeleted()); userAuthoredInfo.setDecoAttachmentsList(decoAttachList); messageManager.markMessageReadForUser(t.getId(), mesWithAttach.getId(), true, getCurrentUserId()); statistics.add(userAuthoredInfo); }catch(Exception e){ LOG.error("MessageForumsStatisticsBean: getUserSubjectMsgBody: selected message Id was not of type Long"); } } return statistics; } Map<String, List> userReadStatisticsCache = new HashMap<String, List>(); public List getUserReadStatistics(){ if(!userReadStatisticsCache.containsKey(selectedSiteUserId)){ final List<UserStatistics> statistics = new ArrayList(); List<Message> messages; if((selectedAllTopicsTopicId == null || "".equals(selectedAllTopicsTopicId)) && (selectedAllTopicsForumId != null && !"".equals(selectedAllTopicsForumId))){ statistics.addAll(messageManager.findReadStatsForStudentByForumId(selectedSiteUserId, Long.parseLong(selectedAllTopicsForumId))); }else if(selectedAllTopicsTopicId != null && !"".equals(selectedAllTopicsTopicId)){ statistics.addAll(messageManager.findReadStatsForStudentByTopicId(selectedSiteUserId, Long.parseLong(selectedAllTopicsTopicId))); }else{ statistics.addAll(messageManager.findReadStatsForStudent(selectedSiteUserId)); } sortStatisticsByUser2(statistics); userReadStatisticsCache.put(selectedSiteUserId, statistics); } else { // sort the statistics List<UserStatistics> statistics = userReadStatisticsCache.get(selectedSiteUserId); sortStatisticsByUser2(statistics); userReadStatisticsCache.put(selectedSiteUserId, statistics); } return userReadStatisticsCache.get(selectedSiteUserId); } public class dMessageStatusInfo{ private String forumTitle; private String topicTitle; private Long messageId; private Date messageCreated; private String messageTitle; public dMessageStatusInfo(String forumTitle, String topicTitle, Long messageId, Date messageCreated, String messageTitle){ this.forumTitle = forumTitle; this.topicTitle = topicTitle; this.messageId = messageId; this.messageCreated = messageCreated; this.messageTitle = messageTitle; } public String getForumTitle() { return forumTitle; } public String getTopicTitle() { return topicTitle; } public Long getMessageId() { return messageId; } public Date getMessageCreated() { return messageCreated; } public String getMessageTitle() { return messageTitle; } } /** * Sorting Utils */ private List sortStatistics(List statistics){ Comparator comparator = determineComparator(); Collections.sort(statistics, comparator); return statistics; } private List sortStatisticsByUser(List statistics){ Comparator comparator = determineComparatorByUser(); Collections.sort(statistics, comparator); return statistics; } private List sortStatisticsByUser2(List statistics){ Comparator comparator = determineComparatorByUser2(); Collections.sort(statistics, comparator); return statistics; } private List sortStatisticsByUser3(List statistics){ Comparator comparator = determineComparatorByUser3(); Collections.sort(statistics, comparator); return statistics; } private List sortStatisticsByAllTopics(List statistics){ Comparator comparator = determineComparatorByAllTopics(); Collections.sort(statistics, comparator); return statistics; } public void toggleSort(String sortByType) { if (sortBy.equals(sortByType)) { if (ascending) { ascending = false; } else { ascending = true; } } else { sortBy = sortByType; ascending = true; } } public void toggleSortByUser(String sortByType) { if (sortByUser.equals(sortByType)) { if (ascendingForUser) { ascendingForUser = false; } else { ascendingForUser = true; } } else { sortByUser = sortByType; ascendingForUser = true; } } public void toggleSortByUser2(String sortByType) { if (sortByUser2.equals(sortByType)) { if (ascendingForUser2) { ascendingForUser2 = false; } else { ascendingForUser2 = true; } } else { sortByUser2 = sortByType; ascendingForUser2 = true; } } public void toggleSortByUser3(String sortByType) { if (sortByUser3.equals(sortByType)) { if (ascendingForUser3) { ascendingForUser3 = false; } else { ascendingForUser3 = true; } } else { sortByUser3 = sortByType; ascendingForUser3 = true; } } public void toggleSortByAllTopics(String sortByType){ if(sortByAllTopics.equals(sortByType)){ ascendingForAllTopics = !ascendingForAllTopics; }else{ sortByAllTopics = sortByType; ascendingForAllTopics = true; } } public String toggleNameSort() { toggleSort(NAME_SORT); return LIST_PAGE; } public String toggleAuthoredSort() { toggleSort(AUTHORED_SORT); return LIST_PAGE; } public String toggleReadSort() { toggleSort(READ_SORT); return LIST_PAGE; } public String toggleUnreadSort() { toggleSort(UNREAD_SORT); return LIST_PAGE; } public String togglePercentReadSort() { toggleSort(PERCENT_READ_SORT); return LIST_PAGE; } public String toggleGradeSort() { toggleSort(GRADE_SORT); return LIST_PAGE; } public String toggleForumTitleSort() { toggleSortByUser(FORUM_TITLE_SORT); return FORUM_STATISTICS_USER; } public boolean isForumTitleSort() { if (sortByUser.equals(FORUM_TITLE_SORT)) return true; return false; } public String toggleTopicTitleSort() { toggleSortByUser(TOPIC_TITLE_SORT); return FORUM_STATISTICS_USER; } public boolean isTopicTitleSort() { if (sortByUser.equals(TOPIC_TITLE_SORT)) return true; return false; } public String toggleDateSort() { toggleSortByUser(FORUM_DATE_SORT); return FORUM_STATISTICS_USER; } public boolean isForumDateSort() { if (sortByUser.equals(FORUM_DATE_SORT)) return true; return false; } public String toggleSubjectSort() { toggleSortByUser(FORUM_SUBJECT_SORT); return FORUM_STATISTICS_USER; } public boolean isForumSubjectSort() { if (sortByUser.equals(FORUM_SUBJECT_SORT)) return true; return false; } public String toggleForumTitleSort2() { toggleSortByUser2(FORUM_TITLE_SORT2); return FORUM_STATISTICS_USER; } public boolean isForumTitleSort2() { if (sortByUser2.equals(FORUM_TITLE_SORT2)) return true; return false; } public String toggleTopicTitleSort2() { toggleSortByUser2(TOPIC_TITLE_SORT2); return FORUM_STATISTICS_USER; } public boolean isTopicTitleSort2() { if (sortByUser2.equals(TOPIC_TITLE_SORT2)) return true; return false; } public String toggleDateSort2() { toggleSortByUser2(FORUM_DATE_SORT2); return FORUM_STATISTICS_USER; } public boolean isForumDateSort2() { if (sortByUser2.equals(FORUM_DATE_SORT2)) return true; return false; } public String toggleSubjectSort2() { toggleSortByUser2(FORUM_SUBJECT_SORT2); return FORUM_STATISTICS_USER; } public boolean isForumSubjectSort2() { if (sortByUser2.equals(FORUM_SUBJECT_SORT2)) return true; return false; } public String toggleDateSort3() { toggleSortByUser3(FORUM_DATE_SORT3); return FORUM_STATISTICS_ALL_AUTHORED_MSG; } public boolean isForumDateSort3() { if (sortByUser3.equals(FORUM_DATE_SORT3)) return true; return false; } public String toggleTopicTitleSort3() { toggleSortByUser3(TOPIC_TITLE_SORT3); return FORUM_STATISTICS_ALL_AUTHORED_MSG; } public boolean isTopicTitleSort3() { if (sortByUser3.equals(TOPIC_TITLE_SORT3)) return true; return false; } public String toggleAllTopicsForumTitleSort(){ toggleSortByAllTopics(ALL_TOPICS_FORUM_TITLE_SORT); return FORUM_STATISTICS_BY_ALL_TOPICS; } public boolean isAllTopicsForumTitleSort(){ return ALL_TOPICS_FORUM_TITLE_SORT.equals(sortByAllTopics); } public String toggleAllTopicsForumDateSort(){ toggleSortByAllTopics(ALL_TOPICS_FORUM_DATE_SORT); return FORUM_STATISTICS_BY_ALL_TOPICS; } public boolean isAllTopicsForumDateSort(){ return ALL_TOPICS_FORUM_DATE_SORT.equals(sortByAllTopics); } public String toggleAllTopicsTopicDateSort(){ toggleSortByAllTopics(ALL_TOPICS_TOPIC_DATE_SORT); return FORUM_STATISTICS_BY_ALL_TOPICS; } public boolean isAllTopicsTopicDateSort(){ return ALL_TOPICS_TOPIC_DATE_SORT.equals(sortByAllTopics); } public String toggleAllTopicsTopicTitleSort(){ toggleSortByAllTopics(ALL_TOPICS_TOPIC_TITLE_SORT); return FORUM_STATISTICS_BY_ALL_TOPICS; } public boolean isAllTopicsTopicTitleSort(){ return ALL_TOPICS_TOPIC_TITLE_SORT.equals(sortByAllTopics); } public String toggleAllTopicsTopicTotalMessagesSort(){ toggleSortByAllTopics(ALL_TOPICS_TOPIC_TOTAL_MESSAGES_SORT); return FORUM_STATISTICS_BY_ALL_TOPICS; } public boolean isAllTopicsTopicTotalMessagesSort(){ return ALL_TOPICS_TOPIC_TOTAL_MESSAGES_SORT.equals(sortByAllTopics); } public String toggleTopicNameSort() { toggleSort(NAME_SORT); return FORUM_STATISTICS_BY_TOPIC; } public String toggleTopicAuthoredSort() { toggleSort(AUTHORED_SORT); return FORUM_STATISTICS_BY_TOPIC; } public String toggleTopicReadSort() { toggleSort(READ_SORT); return FORUM_STATISTICS_BY_TOPIC; } public String toggleTopicUnreadSort() { toggleSort(UNREAD_SORT); return FORUM_STATISTICS_BY_TOPIC; } public String toggleTopicPercentReadSort() { toggleSort(PERCENT_READ_SORT); return FORUM_STATISTICS_BY_TOPIC; } public String toggleTopicGradeSort() { toggleSort(GRADE_SORT); return FORUM_STATISTICS_BY_TOPIC; } public boolean isNameSort() { if (sortBy.equals(NAME_SORT)) return true; return false; } public boolean isAuthoredSort() { if (sortBy.equals(AUTHORED_SORT)) return true; return false; } public boolean isReadSort() { if (sortBy.equals(READ_SORT)) return true; return false; } public boolean isUnreadSort() { if (sortBy.equals(UNREAD_SORT)) return true; return false; } public boolean isPercentReadSort() { if (sortBy.equals(PERCENT_READ_SORT)) return true; return false; } public boolean isGradeSort() { if (sortBy.equals(GRADE_SORT)) return true; return false; } public boolean isAscending() { return ascending; } public boolean isAscendingForUser() { return ascendingForUser; } public boolean isAscendingForUser2() { return ascendingForUser2; } public boolean isAscendingForUser3() { return ascendingForUser3; } public boolean isAscendingForAllTopics(){ return ascendingForAllTopics; } private Comparator determineComparator(){ if(ascending){ if (sortBy.equals(NAME_SORT)){ return nameComparatorAsc; }else if (sortBy.equals(AUTHORED_SORT)){ return authoredComparatorAsc; }else if (sortBy.equals(READ_SORT)){ return readComparatorAsc; }else if (sortBy.equals(UNREAD_SORT)){ return unreadComparatorAsc; }else if (sortBy.equals(PERCENT_READ_SORT)){ return percentReadComparatorAsc; }else if(sortBy.equals(GRADE_SORT)){ return GradeComparatorAsc; } }else{ if (sortBy.equals(NAME_SORT)){ return nameComparatorDesc; }else if (sortBy.equals(AUTHORED_SORT)){ return authoredComparatorDesc; }else if (sortBy.equals(READ_SORT)){ return readComparatorDesc; }else if (sortBy.equals(UNREAD_SORT)){ return unreadComparatorDesc; }else if (sortBy.equals(PERCENT_READ_SORT)){ return percentReadComparatorDesc; }else if(sortBy.equals(GRADE_SORT)){ return GradeComparatorDesc; } } //default return NameComparatorAsc return nameComparatorAsc; } private Comparator determineComparatorByUser(){ if(ascendingForUser){ if (sortByUser.equals(FORUM_TITLE_SORT)){ return forumTitleComparatorAsc; }else if (sortByUser.equals(FORUM_DATE_SORT)){ return forumDateComparatorAsc; }else if (sortByUser.equals(FORUM_SUBJECT_SORT)){ return forumSubjectComparatorAsc; }else if (sortByUser.equals(TOPIC_TITLE_SORT)){ return topicTitleComparatorAsc; } }else{ if (sortByUser.equals(FORUM_TITLE_SORT)){ return forumTitleComparatorDesc; }else if (sortByUser.equals(FORUM_DATE_SORT)){ return forumDateComparatorDesc; }else if (sortByUser.equals(FORUM_SUBJECT_SORT)){ return forumSubjectComparatorDesc; }else if (sortByUser.equals(TOPIC_TITLE_SORT)){ return topicTitleComparatorDesc; } } //default return NameComparatorAsc return forumDateComparatorDesc; } private Comparator determineComparatorByUser2(){ if(ascendingForUser2){ if (sortByUser2.equals(FORUM_TITLE_SORT2)){ return forumTitleComparatorAsc; }else if (sortByUser2.equals(FORUM_DATE_SORT2)){ return forumDateComparatorAsc; }else if (sortByUser2.equals(FORUM_SUBJECT_SORT2)){ return forumSubjectComparatorAsc; }else if (sortByUser2.equals(TOPIC_TITLE_SORT2)){ return topicTitleComparatorAsc; } }else{ if (sortByUser2.equals(FORUM_TITLE_SORT2)){ return forumTitleComparatorDesc; }else if (sortByUser2.equals(FORUM_DATE_SORT2)){ return forumDateComparatorDesc; }else if (sortByUser2.equals(FORUM_SUBJECT_SORT2)){ return forumSubjectComparatorDesc; }else if (sortByUser2.equals(TOPIC_TITLE_SORT2)){ return topicTitleComparatorDesc; } } //default return NameComparatorAsc return forumDateComparatorDesc; } private Comparator determineComparatorByUser3(){ if(ascendingForUser3){ if (sortByUser3.equals(TOPIC_TITLE_SORT3)){ return topicTitleComparatorAsc; }else if (sortByUser3.equals(FORUM_DATE_SORT3)){ return forumDateComparatorAsc; } }else{ if (sortByUser3.equals(TOPIC_TITLE_SORT3)){ return topicTitleComparatorDesc; }else if (sortByUser3.equals(FORUM_DATE_SORT3)){ return forumDateComparatorDesc; } } //default return NameComparatorAsc return forumDateComparatorDesc; } private Comparator determineComparatorByAllTopics(){ if(ascendingForAllTopics){ if (sortByAllTopics.equals(ALL_TOPICS_FORUM_DATE_SORT)){ return AllTopicsForumDateComparatorAsc; }else if (sortByAllTopics.equals(ALL_TOPICS_FORUM_TITLE_SORT)){ return AllTopicsForumTitleComparatorAsc; }else if (sortByAllTopics.equals(ALL_TOPICS_TOPIC_TITLE_SORT)){ return AllTopicsTopicTitleComparatorAsc; }else if (sortByAllTopics.equals(ALL_TOPICS_TOPIC_TOTAL_MESSAGES_SORT)){ return AllTopicsTopicTotalMessagesComparatorAsc; }else if(sortByAllTopics.equals(ALL_TOPICS_TOPIC_DATE_SORT)){ return AllTopicsTopicDateComparatorAsc; } }else{ if (sortByAllTopics.equals(ALL_TOPICS_FORUM_DATE_SORT)){ return AllTopicsForumDateComparatorDesc; }else if (sortByAllTopics.equals(ALL_TOPICS_FORUM_TITLE_SORT)){ return AllTopicsForumTitleComparatorDesc; }else if (sortByAllTopics.equals(ALL_TOPICS_TOPIC_TITLE_SORT)){ return AllTopicsTopicTitleComparatorDesc; }else if (sortByAllTopics.equals(ALL_TOPICS_TOPIC_TOTAL_MESSAGES_SORT)){ return AllTopicsTopicTotalMessagesComparatorDesc; }else if(sortByAllTopics.equals(ALL_TOPICS_TOPIC_DATE_SORT)){ return AllTopicsTopicDateComparatorDesc; } } //default return NameComparatorAsc return AllTopicsForumTitleComparatorDesc; } static { /** * Comparators for DecoratedCompileMessageStatistics */ nameComparatorAsc = new Comparator(){ public int compare(Object item, Object anotherItem){ String name1 = ((DecoratedCompiledMessageStatistics) item).getSiteUser().toUpperCase(); String name2 = ((DecoratedCompiledMessageStatistics) anotherItem).getSiteUser().toUpperCase(); return name1.compareTo(name2); } }; authoredComparatorAsc = new Comparator(){ public int compare(Object item, Object anotherItem){ int authored1 = ((DecoratedCompiledMessageStatistics) item).getAuthoredForumsAmt(); int authored2 = ((DecoratedCompiledMessageStatistics) anotherItem).getAuthoredForumsAmt(); if(authored1 - authored2 == 0){ //we can't have descrepancies on how the order happens, otherwise jsf will scramble the scores //with other scores that are equal to this (jsp submits twice, causing "sort" to happen between when //the user enters the data and when it gets submitted in JSP (behind the scenes) return nameComparatorAsc.compare(item, anotherItem); }else{ return authored1 - authored2; } } }; readComparatorAsc = new Comparator(){ public int compare(Object item, Object anotherItem){ int read1 = ((DecoratedCompiledMessageStatistics) item).getReadForumsAmt(); int read2 = ((DecoratedCompiledMessageStatistics) anotherItem).getReadForumsAmt(); if(read1 - read2 == 0){ //we can't have descrepancies on how the order happens, otherwise jsf will scramble the scores //with other scores that are equal to this (jsp submits twice, causing "sort" to happen between when //the user enters the data and when it gets submitted in JSP (behind the scenes) return nameComparatorAsc.compare(item, anotherItem); }else{ return read1 - read2; } } }; unreadComparatorAsc = new Comparator(){ public int compare(Object item, Object anotherItem){ int unread1 = ((DecoratedCompiledMessageStatistics) item).getUnreadForumsAmt(); int unread2 = ((DecoratedCompiledMessageStatistics) anotherItem).getUnreadForumsAmt(); if(unread1 - unread2 == 0){ //we can't have descrepancies on how the order happens, otherwise jsf will scramble the scores //with other scores that are equal to this (jsp submits twice, causing "sort" to happen between when //the user enters the data and when it gets submitted in JSP (behind the scenes) return nameComparatorAsc.compare(item, anotherItem); }else{ return unread1 - unread2; } } }; percentReadComparatorAsc = new Comparator(){ public int compare(Object item, Object anotherItem){ double percentRead1 = ((DecoratedCompiledMessageStatistics) item).getPercentReadForumsAmt(); double percentRead2 = ((DecoratedCompiledMessageStatistics) anotherItem).getPercentReadForumsAmt(); if(percentRead1 == percentRead2){ //we can't have descrepancies on how the order happens, otherwise jsf will scramble the scores //with other scores that are equal to this (jsp submits twice, causing "sort" to happen between when //the user enters the data and when it gets submitted in JSP (behind the scenes) return nameComparatorAsc.compare(item, anotherItem); } else if(percentRead1 < percentRead2){ return -1; } else { return 1; } } }; nameComparatorDesc = new Comparator(){ public int compare(Object item, Object anotherItem){ String name1 = ((DecoratedCompiledMessageStatistics) item).getSiteUser().toUpperCase(); String name2 = ((DecoratedCompiledMessageStatistics) anotherItem).getSiteUser().toUpperCase(); return name2.compareTo(name1); } }; forumTitleComparatorAsc = new Comparator(){ public int compare(Object item, Object anotherItem){ String title1 = ((UserStatistics) item).getForumTitle().toUpperCase(); String title2 = ((UserStatistics) anotherItem).getForumTitle().toUpperCase(); return title1.compareTo(title2); } }; topicTitleComparatorAsc = new Comparator(){ public int compare(Object item, Object anotherItem){ String title1 = ((UserStatistics) item).getTopicTitle().toUpperCase(); String title2 = ((UserStatistics) anotherItem).getTopicTitle().toUpperCase(); return title1.compareTo(title2); } }; forumDateComparatorAsc = new Comparator(){ public int compare(Object item, Object anotherItem){ Date date1 = ((UserStatistics) item).getForumDate(); Date date2 = ((UserStatistics) anotherItem).getForumDate(); return date1.compareTo(date2); } }; forumSubjectComparatorAsc = new Comparator(){ public int compare(Object item, Object anotherItem){ String subject1 = ((UserStatistics) item).getForumSubject().toUpperCase(); String subject2 = ((UserStatistics) anotherItem).getForumSubject().toUpperCase(); return subject1.compareTo(subject2); } }; authoredComparatorDesc = new Comparator(){ public int compare(Object item, Object anotherItem){ int authored1 = ((DecoratedCompiledMessageStatistics) item).getAuthoredForumsAmt(); int authored2 = ((DecoratedCompiledMessageStatistics) anotherItem).getAuthoredForumsAmt(); if(authored1 - authored2 == 0){ //we can't have descrepancies on how the order happens, otherwise jsf will scramble the scores //with other scores that are equal to this (jsp submits twice, causing "sort" to happen between when //the user enters the data and when it gets submitted in JSP (behind the scenes) return nameComparatorAsc.compare(item, anotherItem); }else{ return authored2 - authored1; } } }; readComparatorDesc = new Comparator(){ public int compare(Object item, Object anotherItem){ int read1 = ((DecoratedCompiledMessageStatistics) item).getReadForumsAmt(); int read2 = ((DecoratedCompiledMessageStatistics) anotherItem).getReadForumsAmt(); if(read1 - read2 == 0){ //we can't have descrepancies on how the order happens, otherwise jsf will scramble the scores //with other scores that are equal to this (jsp submits twice, causing "sort" to happen between when //the user enters the data and when it gets submitted in JSP (behind the scenes) return nameComparatorAsc.compare(item, anotherItem); }else{ return read2 - read1; } } }; unreadComparatorDesc = new Comparator(){ public int compare(Object item, Object anotherItem){ int unread1 = ((DecoratedCompiledMessageStatistics) item).getUnreadForumsAmt(); int unread2 = ((DecoratedCompiledMessageStatistics) anotherItem).getUnreadForumsAmt(); if(unread1 - unread2 == 0){ //we can't have descrepancies on how the order happens, otherwise jsf will scramble the scores //with other scores that are equal to this (jsp submits twice, causing "sort" to happen between when //the user enters the data and when it gets submitted in JSP (behind the scenes) return nameComparatorAsc.compare(item, anotherItem); }else{ return unread2 - unread1; } } }; percentReadComparatorDesc = new Comparator(){ public int compare(Object item, Object anotherItem){ double percentRead1 = ((DecoratedCompiledMessageStatistics) item).getPercentReadForumsAmt(); double percentRead2 = ((DecoratedCompiledMessageStatistics) anotherItem).getPercentReadForumsAmt(); if(percentRead1 == percentRead2){ //we can't have descrepancies on how the order happens, otherwise jsf will scramble the scores //with other scores that are equal to this (jsp submits twice, causing "sort" to happen between when //the user enters the data and when it gets submitted in JSP (behind the scenes) return nameComparatorAsc.compare(item, anotherItem); } else if(percentRead1 < percentRead2){ return 1; } else { return -1; } } }; /** * Comparator for DecoratedCompiledUserStatistics */ dateComparaterDesc = new Comparator(){ public int compare(Object item, Object anotherItem){ Date date1 = ((UserStatistics) item).getForumDate(); Date date2 = ((UserStatistics) anotherItem).getForumDate(); return date2.compareTo(date1); } }; forumTitleComparatorDesc = new Comparator(){ public int compare(Object item, Object anotherItem){ String title1 = ((UserStatistics) item).getForumTitle().toUpperCase(); String title2 = ((UserStatistics) anotherItem).getForumTitle().toUpperCase(); return title2.compareTo(title1); } }; topicTitleComparatorDesc = new Comparator(){ public int compare(Object item, Object anotherItem){ String title1 = ((UserStatistics) item).getTopicTitle().toUpperCase(); String title2 = ((UserStatistics) anotherItem).getTopicTitle().toUpperCase(); return title2.compareTo(title1); } }; forumDateComparatorDesc = new Comparator(){ public int compare(Object item, Object anotherItem){ Date date1 = ((UserStatistics) item).getForumDate(); Date date2 = ((UserStatistics) anotherItem).getForumDate(); return date2.compareTo(date1); } }; forumSubjectComparatorDesc = new Comparator(){ public int compare(Object item, Object anotherItem){ String subject1 = ((UserStatistics) item).getForumSubject().toUpperCase(); String subject2 = ((UserStatistics) anotherItem).getForumSubject().toUpperCase(); return subject2.compareTo(subject1); } }; AllTopicsForumDateComparatorDesc = new Comparator(){ public int compare(Object item, Object anotherItem){ Date date1 = ((DecoratedCompiledStatisticsByTopic) item).getForumDate(); Date date2 = ((DecoratedCompiledStatisticsByTopic) anotherItem).getForumDate(); return date2.compareTo(date1); } }; AllTopicsForumDateComparatorAsc = new Comparator(){ public int compare(Object item, Object anotherItem){ Date date1 = ((DecoratedCompiledStatisticsByTopic) item).getForumDate(); Date date2 = ((DecoratedCompiledStatisticsByTopic) anotherItem).getForumDate(); return date1.compareTo(date2); } }; AllTopicsTopicDateComparatorDesc = new Comparator(){ public int compare(Object item, Object anotherItem){ Date date1 = ((DecoratedCompiledStatisticsByTopic) item).getTopicDate(); Date date2 = ((DecoratedCompiledStatisticsByTopic) anotherItem).getTopicDate(); return date2.compareTo(date1); } }; AllTopicsTopicDateComparatorAsc = new Comparator(){ public int compare(Object item, Object anotherItem){ Date date1 = ((DecoratedCompiledStatisticsByTopic) item).getTopicDate(); Date date2 = ((DecoratedCompiledStatisticsByTopic) anotherItem).getTopicDate(); return date1.compareTo(date2); } }; AllTopicsTopicTitleComparatorAsc = new Comparator(){ public int compare(Object item, Object anotherItem){ String title1 = ((DecoratedCompiledStatisticsByTopic) item).getTopicTitle().toUpperCase(); String title2 = ((DecoratedCompiledStatisticsByTopic) anotherItem).getTopicTitle().toUpperCase(); return title1.compareTo(title2); } }; AllTopicsTopicTitleComparatorDesc = new Comparator(){ public int compare(Object item, Object anotherItem){ String title1 = ((DecoratedCompiledStatisticsByTopic) item).getTopicTitle().toUpperCase(); String title2 = ((DecoratedCompiledStatisticsByTopic) anotherItem).getTopicTitle().toUpperCase(); return title2.compareTo(title1); } }; AllTopicsForumTitleComparatorAsc = new Comparator(){ public int compare(Object item, Object anotherItem){ String title1 = ((DecoratedCompiledStatisticsByTopic) item).getForumTitle().toUpperCase(); String title2 = ((DecoratedCompiledStatisticsByTopic) anotherItem).getForumTitle().toUpperCase(); return title1.compareTo(title2); } }; AllTopicsForumTitleComparatorDesc = new Comparator(){ public int compare(Object item, Object anotherItem){ String title1 = ((DecoratedCompiledStatisticsByTopic) item).getForumTitle().toUpperCase(); String title2 = ((DecoratedCompiledStatisticsByTopic) anotherItem).getForumTitle().toUpperCase(); return title2.compareTo(title1); } }; AllTopicsTopicTotalMessagesComparatorAsc = new Comparator(){ public int compare(Object item, Object anotherItem){ int read1 = ((DecoratedCompiledStatisticsByTopic) item).getTotalTopicMessages(); int read2 = ((DecoratedCompiledStatisticsByTopic) anotherItem).getTotalTopicMessages(); return read1 - read2; } }; AllTopicsTopicTotalMessagesComparatorDesc = new Comparator(){ public int compare(Object item, Object anotherItem){ int read1 = ((DecoratedCompiledStatisticsByTopic) item).getTotalTopicMessages(); int read2 = ((DecoratedCompiledStatisticsByTopic) anotherItem).getTotalTopicMessages(); return read2 - read1; } }; GradeComparatorAsc = new Comparator(){ public int compare(Object item, Object anotherItem){ DecoratedCompiledMessageStatistics stat = ((DecoratedCompiledMessageStatistics) item); DecoratedCompiledMessageStatistics stat2 = ((DecoratedCompiledMessageStatistics) anotherItem); if(stat.getGradebookAssignment() == null || !stat.getGradebookAssignment().isAllowedToGrade()) return -1; if(stat2.getGradebookAssignment() == null || !stat2.getGradebookAssignment().isAllowedToGrade()) return 1; if(stat.getGradebookAssignment().getScore() == null || "".equals(stat.getGradebookAssignment().getScore())) return -1; if(stat2.getGradebookAssignment().getScore() == null || "".equals(stat.getGradebookAssignment().getScore())) return 1; if(!isNumber(stat.getGradebookAssignment().getScore())) return -1; if(!isNumber(stat2.getGradebookAssignment().getScore())) return 1; try{ double val = Double.valueOf(stat.getGradebookAssignment().getScore()).doubleValue() - Double.valueOf(stat2.getGradebookAssignment().getScore()).doubleValue(); if(val > 0){ return 1; }else{ return -1; } }catch(NumberFormatException e){ } //we can't have descrepancies on how the order happens, otherwise jsf will scramble the scores //with other scores that are equal to this (jsp submits twice, causing "sort" to happen between when //the user enters the data and when it gets submitted in JSP (behind the scenes) return nameComparatorAsc.compare(item, anotherItem); } }; GradeComparatorDesc = new Comparator(){ public int compare(Object item, Object anotherItem){ DecoratedCompiledMessageStatistics stat = ((DecoratedCompiledMessageStatistics) item); DecoratedCompiledMessageStatistics stat2 = ((DecoratedCompiledMessageStatistics) anotherItem); if(stat.getGradebookAssignment() == null || !stat.getGradebookAssignment().isAllowedToGrade()) return 1; if(stat2.getGradebookAssignment() == null || !stat2.getGradebookAssignment().isAllowedToGrade()) return -1; if(stat.getGradebookAssignment().getScore() == null || "".equals(stat.getGradebookAssignment().getScore())) return 1; if(stat2.getGradebookAssignment().getScore() == null || "".equals(stat.getGradebookAssignment().getScore())) return -1; if(!isNumber(stat.getGradebookAssignment().getScore())) return 1; if(!isNumber(stat2.getGradebookAssignment().getScore())) return -1; try{ double val = Double.valueOf(stat.getGradebookAssignment().getScore()).doubleValue() - Double.valueOf(stat2.getGradebookAssignment().getScore()).doubleValue(); if(val < 0){ return 1; }else{ return -1; } }catch(NumberFormatException e){ } //we can't have descrepancies on how the order happens, otherwise jsf will scramble the scores //with other scores that are equal to this (jsp submits twice, causing "sort" to happen between when //the user enters the data and when it gets submitted in JSP (behind the scenes) return nameComparatorAsc.compare(item, anotherItem); } }; } /** * Actions */ /** * @return */ public String processActionStatisticsUser() { LOG.debug("processActionStatisticsUser"); selectedSiteUserId = getExternalParameterByKey(SITE_USER_ID); //reset cache userReadStatisticsCache = new HashMap<String, List>(); userAuthoredStatisticsCache = new HashMap<String, List>(); return processActionStatisticsUserHelper(); } public String processActionStatisticsUserHelper(){ selectedSiteUser = getUserName(selectedSiteUserId); isLastParticipant = false; isFirstParticipant = false; Map<String, String> userIdName = getUserIdName(); Set<String> userIdSet = userIdName.keySet(); String[] userIdArray =(String[]) userIdSet.toArray(new String[userIdSet.size()]); int currentPosition = getCurrentPosition(userIdArray, selectedSiteUserId); if(currentPosition == 0) { isFirstParticipant = true; } if(currentPosition == userIdArray.length - 1) { isLastParticipant = true; } return FORUM_STATISTICS_USER; } private String getUserName(String userId) { String userName=""; try { User user=UserDirectoryService.getUser(userId) ; if (ServerConfigurationService.getBoolean("msg.displayEid", true)) { if(user != null) { userName= user.getLastName() + ", " + user.getFirstName() + " (" + user.getDisplayId() + ")" ; } } else { if(user != null) { userName = user.getLastName() + ", " + user.getFirstName(); } } } catch (UserNotDefinedException e) { e.printStackTrace(); } return userName; } public String processActionBackToUser() { return FORUM_STATISTICS_USER; } // **************************************** helper methods********************************** private String getExternalParameterByKey(String parameterId) { ExternalContext context = FacesContext.getCurrentInstance() .getExternalContext(); Map paramMap = context.getRequestParameterMap(); return (String) paramMap.get(parameterId); } public String getButtonUserName() { String userName; String firstName; String lastName; int firstIndex = 0; int secondIndex = 0; if (ServerConfigurationService.getBoolean("msg.displayEid", true)) { firstIndex = selectedSiteUser.indexOf(","); secondIndex = selectedSiteUser.indexOf("("); lastName = selectedSiteUser.substring(0, firstIndex); firstName = selectedSiteUser.substring(firstIndex + 2, secondIndex-1); userName = firstName + " " + lastName; } else { firstIndex = selectedSiteUser.indexOf(","); lastName = selectedSiteUser.substring(0, firstIndex); firstName = selectedSiteUser.substring(firstIndex+2); userName = firstName + " " + lastName; } buttonUserName = getResourceBundleString("return_to_statistics" , new Object[] {userName}) ; return buttonUserName; } public void setButtonUserName(String buttonUserName) { this.buttonUserName = buttonUserName; } public static String getResourceBundleString(String key) { final ResourceLoader rb = new ResourceLoader(MESSAGECENTER_BUNDLE); return rb.getString(key); } public static String getResourceBundleString(String key, Object[] args) { final ResourceLoader rb = new ResourceLoader(MESSAGECENTER_BUNDLE); return rb.getFormattedMessage(key, args); } public String getSelectedMsgId() { return selectedMsgId; } public void setSelectedMsgId(String selectedMsgId) { this.selectedMsgId = selectedMsgId; } public String getSelectedMsgSubject() { return selectedMsgSubject; } public void setSelectedMsgSubject(String selectedMsgSubject) { this.selectedMsgSubject = selectedMsgSubject; } public String processActionDisplayMsgBody() { LOG.debug("processActionDisplayMsgBody"); selectedMsgId = getExternalParameterByKey("msgId"); Message message =(Message) messageManager.getMessageById(Long.parseLong(selectedMsgId)); selectedMsgSubject = message.getTitle(); return FORUM_STATISTICS_MSG; } public String getSelectedForumTitle() { return selectedForumTitle; } public void setSelectedForumTitle(String selectedForumTitle) { this.selectedForumTitle = selectedForumTitle; } public String getSelectedTopicTitle() { return selectedTopicTitle; } public void setSelectedTopicTitle(String selectedTopicTitle) { this.selectedTopicTitle = selectedTopicTitle; } public Map<String, String> getUserIdName() { Map<String, String> idNameMap = new LinkedHashMap<String, String>(); Map courseMemberMap = membershipManager.getAllCourseMembers(true,false,false,null); List members = membershipManager.convertMemberMapToList(courseMemberMap); for (Iterator i = members.iterator(); i.hasNext();) { MembershipItem item = (MembershipItem) i.next(); if (null != item.getUser()) { idNameMap.put(item.getUser().getId(), item.getName()); } } return idNameMap; } private int getCurrentPosition(Object[] userIdArray, String userId) { int currentPosition = -1; for (int i =0; i < userIdArray.length; i++) { if(userIdArray[i].equals(userId)) { currentPosition = i; break; } } return currentPosition; } public String processDisplayNextParticipant() { isLastParticipant = false; isFirstParticipant = false; Map<String, String> userIdName = getUserIdName(); Set<String> userIdSet = userIdName.keySet(); String[] userIdArray =(String[]) userIdSet.toArray(new String[userIdSet.size()]); int currentPosition = getCurrentPosition(userIdArray, selectedSiteUserId); if(currentPosition < userIdArray.length-1) { selectedSiteUserId = userIdArray[currentPosition+1]; selectedSiteUser = (String)userIdName.get(selectedSiteUserId); } if(currentPosition == userIdArray.length - 2) { isLastParticipant = true; } return FORUM_STATISTICS_USER; } public String processDisplayPreviousParticipant() { isLastParticipant = false; isFirstParticipant = false; Map<String, String> userIdName = getUserIdName(); Set<String> userIdSet = userIdName.keySet(); String[] userIdArray =(String[]) userIdSet.toArray(new String[userIdSet.size()]); int currentPosition = getCurrentPosition(userIdArray, selectedSiteUserId); if(currentPosition > 0) { selectedSiteUserId = userIdArray[currentPosition -1]; selectedSiteUser = (String)userIdName.get(selectedSiteUserId); } if(currentPosition == 1) { isFirstParticipant = true; } return FORUM_STATISTICS_USER; } public boolean getIsFirstParticipant() { return isFirstParticipant; } public void setFirstParticipant(boolean isFirstParticipant) { this.isFirstParticipant = isFirstParticipant; } public boolean getIsLastParticipant() { return isLastParticipant; } public void setLastParticipant(boolean isLastParticipant) { this.isLastParticipant = isLastParticipant; } public String processActionStatisticsByAllTopics(){ return FORUM_STATISTICS_BY_ALL_TOPICS; } public String processActionStatisticsByTopic() { LOG.debug("processActionStatisticsByTopic"); //to save some speed, only update if the values have changed boolean newTopic = !getExternalParameterByKey(TOPIC_ID).equals(selectedAllTopicsTopicId); boolean newForum = !getExternalParameterByKey(FORUM_ID).equals(selectedAllTopicsForumId); selectedAllTopicsTopicId = getExternalParameterByKey(TOPIC_ID); selectedAllTopicsForumId = getExternalParameterByKey(FORUM_ID); if(newForum){ if(selectedAllTopicsForumId != null && !"".equals(selectedAllTopicsForumId)){ try{ DiscussionForum df = forumManager.getForumById(Long.parseLong(selectedAllTopicsForumId)); selectedAllTopicsForumTitle = df.getTitle(); }catch (Exception e) { LOG.warn("MessageForumStatisticsBean.processActionStatisticsByTopic: Wasn't able to find discussion forum for id: " + selectedAllTopicsForumId); } } } if(newTopic){ if(selectedAllTopicsTopicId != null && !"".equals(selectedAllTopicsTopicId)){ try{ DiscussionTopic dt = forumManager.getTopicById(Long.parseLong(selectedAllTopicsTopicId)); selectedAllTopicsTopicTitle = dt.getTitle(); }catch (Exception e) { LOG.warn("MessageForumStatisticsBean.processActionStatisticsByTopic: Wasn't able to find discussion topic for id: " + selectedAllTopicsForumId); } } } return FORUM_STATISTICS_BY_TOPIC; } public String getSelectedAllTopicsTopicTitle() { return selectedAllTopicsTopicTitle; } public void setSelectedAllTopicsTopicTitle(String selectedAllTopicsTopicTitle) { this.selectedAllTopicsTopicTitle = selectedAllTopicsTopicTitle; } public String getSelectedAllTopicsForumTitle() { return selectedAllTopicsForumTitle; } public void setSelectedAllTopicsForumTitle(String selectedAllTopicsForumTitle) { this.selectedAllTopicsForumTitle = selectedAllTopicsForumTitle; } public String getSelectedAllTopicsForumId() { return selectedAllTopicsForumId; } public void setSelectedAllTopicsForumId(String selectedAllTopicsForumId) { this.selectedAllTopicsForumId = selectedAllTopicsForumId; } public String getSelectedAllTopicsTopicId() { return selectedAllTopicsTopicId; } public void setSelectedAllTopicsTopicId(String selectedAllTopicsTopicId) { this.selectedAllTopicsTopicId = selectedAllTopicsTopicId; } public void setUpGradebookAssignments(){ try { assignments = new ArrayList<SelectItem>(); assignments.add(new SelectItem(DEFAULT_GB_ITEM, getResourceBundleString(SELECT_ASSIGN))); //Code to get the gradebook service from ComponentManager GradebookService gradebookService = getGradebookService(); if(getGradebookExist()) { List gradeAssignmentsBeforeFilter = gradebookService.getAssignments(ToolManager.getCurrentPlacement().getContext()); for(int i=0; i<gradeAssignmentsBeforeFilter.size(); i++) { Assignment thisAssign = (Assignment) gradeAssignmentsBeforeFilter.get(i); if(!thisAssign.isExternallyMaintained()) { try { assignments.add(new SelectItem(Integer.toString(assignments.size()), thisAssign.getName())); } catch(Exception e) { LOG.error("DiscussionForumTool - processDfMsgGrd:" + e); e.printStackTrace(); } } } } } catch(SecurityException se) { LOG.debug("SecurityException caught while getting assignments.", se); } catch(Exception e1) { LOG.error("DiscussionForumTool&processDfMsgGrad:" + e1); e1.printStackTrace(); } } protected GradebookService getGradebookService() { if (isGradebookDefined()) { return (GradebookService) ComponentManager.get("org.sakaiproject.service.gradebook.GradebookService"); } return null; } protected boolean isGradebookDefined() { boolean rv = false; try { Object og = ComponentManager.get("org.sakaiproject.service.gradebook.GradebookService"); if (!(og instanceof GradebookService)) { LOG.info("Error getting gradebook service from component manager. CM returns:" + og.getClass().getName()); return false; } GradebookService g = (GradebookService) og; String gradebookUid = ToolManager.getInstance().getCurrentPlacement().getContext(); if (g.isGradebookDefined(gradebookUid) && (g.currentUserHasEditPerm(gradebookUid) || g.currentUserHasGradingPerm(gradebookUid))) { rv = true; } } catch (Exception e) { LOG.info(this + "isGradebookDefined " + e.getMessage()); } return rv; } public boolean getGradebookExist() { if (!gradebookExistChecked) { try { GradebookService gradebookService = getGradebookService(); if (gradebookService == null) return false; gradebookExist = gradebookService.isGradebookDefined(ToolManager.getCurrentPlacement().getContext()); gradebookExistChecked = true; return gradebookExist; } catch(Exception e) { gradebookExist = false; gradebookExistChecked = true; return gradebookExist; } } else { return gradebookExist; } } public String processGradeAssignChange(ValueChangeEvent vce) { String changeAssign = (String) vce.getNewValue(); if (changeAssign == null) { return null; } else { gradebookItemChosen = true; selectedAssign = changeAssign; if(!DEFAULT_GB_ITEM.equalsIgnoreCase(selectedAssign)) { String gradebookUid = ToolManager.getCurrentPlacement().getContext(); selAssignName = ((SelectItem)assignments.get((Integer.valueOf(selectedAssign)).intValue())).getLabel(); } return null; } } public String processGroupChange(ValueChangeEvent vce) { String changeAssign = (String) vce.getNewValue(); if (changeAssign == null) { return null; } else { selectedGroup = changeAssign; return null; } } public List<SelectItem> getAssignments() { if(assignments == null){ setUpGradebookAssignments(); } return assignments; } public void setAssignments(List assignments) { this.assignments = assignments; } public void setDefaultSelectedAssign(){ if(!gradebookItemChosen){ if(selectedAllTopicsTopicId != null && !"".equals(selectedAllTopicsTopicId)){ String defaultAssignName = forumManager.getTopicById(Long.parseLong(selectedAllTopicsTopicId)).getDefaultAssignName(); setDefaultSelectedAssign(defaultAssignName); }else{ String defaultAssignName = forumManager.getForumById(Long.parseLong(selectedAllTopicsForumId)).getDefaultAssignName(); setDefaultSelectedAssign(defaultAssignName); } } gradebookItemChosen = false; } public String getSelectedAssign() { return selectedAssign; } public void setSelectedAssign(String selectedAssign) { this.selectedAssign = selectedAssign; } private void resetGradebookVariables(){ gradebookExistChecked = false; gradebookExist = false; assignments = null; selectedAssign = DEFAULT_GB_ITEM; selectedGroup = DEFAULT_GB_ITEM; gradebookItemChosen = false; selAssignName = ""; } private void setDefaultSelectedAssign(String assign){ selectedAssign = DEFAULT_GB_ITEM; selAssignName = ""; if(assign != null){ for (SelectItem item : getAssignments()) { if(assign.equals(item.getLabel())){ selectedAssign = item.getValue().toString(); selAssignName = assign; } } } } private Map<String, DecoratedGradebookAssignment> getGradebookAssignment(){ Map<String, DecoratedGradebookAssignment> returnVal = new HashMap<String, DecoratedGradebookAssignment>(); if(!DEFAULT_GB_ITEM.equalsIgnoreCase(selectedAssign)) { String gradebookUid = ToolManager.getCurrentPlacement().getContext(); selAssignName = ((SelectItem)assignments.get((Integer.valueOf(selectedAssign)).intValue())).getLabel(); GradebookService gradebookService = getGradebookService(); if (gradebookService == null) return returnVal; int gradeEntryType = gradebookService.getGradeEntryType(gradebookUid); if (gradeEntryType == GradebookService.GRADE_TYPE_LETTER) { gradeByLetter = true; gradeByPoints = false; gradeByPercent = false; } else if (gradeEntryType == GradebookService.GRADE_TYPE_PERCENTAGE) { gradeByPercent = true; gradeByPoints = false; gradeByLetter = false; } else { gradeByPoints = true; gradeByPercent = false; gradeByLetter = false; } Assignment assignment = gradebookService.getAssignment(gradebookUid, selAssignName); if(assignment != null){ gbItemPointsPossible = assignment.getPoints().toString(); //grab all grades for the id's that the user is able to grade: Map studentIdFunctionMap = gradebookService.getViewableStudentsForItemForCurrentUser(gradebookUid, assignment.getId()); List<GradeDefinition> grades = gradebookService.getGradesForStudentsForItem(gradebookUid, assignment.getId(), new ArrayList(studentIdFunctionMap.keySet())); //add grade values to return map for(GradeDefinition gradeDef : grades){ String studentUuid = gradeDef.getStudentUid(); DecoratedGradebookAssignment gradeAssignment = new DecoratedGradebookAssignment(); gradeAssignment.setAllowedToGrade(true); gradeAssignment.setScore(gradeDef.getGrade()); gradeAssignment.setComment(gradeDef.getGradeComment()); gradeAssignment.setName(selAssignName); gradeAssignment.setPointsPossible(gbItemPointsPossible); gradeAssignment.setUserUuid(studentUuid); returnVal.put(studentUuid, gradeAssignment); } //now populate empty data for users who can be graded but don't have a grade yet: for (Iterator iterator = studentIdFunctionMap.entrySet().iterator(); iterator.hasNext();) { Entry entry = (Entry) iterator.next(); if(!returnVal.containsKey(entry.getKey().toString())){ //this user needs to be added a gradeable: DecoratedGradebookAssignment gradeAssignment = new DecoratedGradebookAssignment(); gradeAssignment.setAllowedToGrade(true); gradeAssignment.setName(selAssignName); gradeAssignment.setPointsPossible(gbItemPointsPossible); gradeAssignment.setUserUuid(entry.getKey().toString()); returnVal.put(entry.getKey().toString(), gradeAssignment); } } } } return returnVal; } public String getSelAssignName() { return selAssignName; } public void setSelAssignName(String selAssignName) { this.selAssignName = selAssignName; } public String getGbItemPointsPossible() { return gbItemPointsPossible; } public void setGbItemPointsPossible(String gbItemPointsPossible) { this.gbItemPointsPossible = gbItemPointsPossible; } public boolean isGradeByPoints() { return gradeByPoints; } public boolean isGradeByPercent() { return gradeByPercent; } public boolean isGradeByLetter() { return gradeByLetter; } public String proccessActionSubmitGrades(){ GradebookService gradebookService = getGradebookService(); if (gradebookService == null) { return null; } if(gradeStatistics != null){ if(selectedAssign == null || selectedAssign.trim().length()==0 || DEFAULT_GB_ITEM.equalsIgnoreCase(selectedAssign)) { setErrorMessage(getResourceBundleString(NO_ASSGN)); return null; } if(!validateGradeInput()) return null; try { String selectedAssignName = ((SelectItem)assignments.get((Integer.valueOf(selectedAssign)).intValue())).getLabel(); String gradebookUuid = ToolManager.getCurrentPlacement().getContext(); List<GradeDefinition> gradeInfoToSave = new ArrayList<GradeDefinition>(); for (DecoratedCompiledMessageStatistics gradeStatistic : gradeStatistics) { if(gradeStatistic.getGradebookAssignment() != null && gradeStatistic.getGradebookAssignment().isAllowedToGrade()){ //ignore empty grades if(gradeStatistic.getGradebookAssignment().getScore() != null && !"".equals(gradeStatistic.getGradebookAssignment().getScore())){ GradeDefinition gradeDef = new GradeDefinition(); gradeDef.setStudentUid(gradeStatistic.getGradebookAssignment().getUserUuid()); gradeDef.setGrade(gradeStatistic.getGradebookAssignment().getScore()); gradeDef.setGradeComment(gradeStatistic.getGradebookAssignment().getComment()); gradeInfoToSave.add(gradeDef); } } } gradebookService.saveGradesAndComments(gradebookUuid, gradebookService.getAssignment(gradebookUuid, selectedAssignName).getId(), gradeInfoToSave); setSuccessMessage(getResourceBundleString(GRADE_SUCCESSFUL)); } catch(SecurityException se) { LOG.error("MessageForumStatisticsBean Security Exception - proccessActionSubmitGrades:" + se); setErrorMessage(getResourceBundleString("cdfm_no_gb_perm")); } catch(Exception e) { LOG.error("MessageForumStatisticsBean - proccessActionSubmitGrades:" + e); e.printStackTrace(); } String eventRef = ""; if(selectedAllTopicsTopicId != null && !"".equals(selectedAllTopicsTopicId)){ eventRef = getEventReference(selectedAllTopicsTopicId); }else{ eventRef = getEventReference(selectedAllTopicsForumId); } EventTrackingService.post(EventTrackingService.newEvent(DiscussionForumService.EVENT_FORUMS_GRADE, eventRef, true)); } //to stop it from going back to the default gradebook item, set gradebookItemChosen flag: gradebookItemChosen = true; return null; } private String getEventReference(String ref) { String eventMessagePrefix = ""; final String toolId = ToolManager.getCurrentTool().getId(); if (toolId.equals(DiscussionForumService.MESSAGE_CENTER_ID)) eventMessagePrefix = "/messagesAndForums"; else if (toolId.equals(DiscussionForumService.MESSAGES_TOOL_ID)) eventMessagePrefix = "/messages"; else eventMessagePrefix = "/forums"; return eventMessagePrefix + getContextSiteId() + "/" + ref + "/" + SessionManager.getCurrentSessionUserId(); } private boolean validateGradeInput(){ boolean validated = true; Map<String, String> studentIdToGradeMap = new HashMap<String, String>(); for (DecoratedCompiledMessageStatistics gradeStatistic : gradeStatistics) { if(gradeStatistic.getGradebookAssignment() != null && gradeStatistic.getGradebookAssignment().isAllowedToGrade()){ //ignore empty grades if(gradeStatistic.getGradebookAssignment().getScore() != null && !"".equals(gradeStatistic.getGradebookAssignment().getScore())){ studentIdToGradeMap.put(gradeStatistic.getGradebookAssignment().getUserUuid(), gradeStatistic.getGradebookAssignment().getScore()); } } } GradebookService gradebookService = getGradebookService(); String gradebookUid = ToolManager.getCurrentPlacement().getContext(); List<String> studentsWithInvalidGrades = gradebookService.identifyStudentsWithInvalidGrades( gradebookUid, studentIdToGradeMap); if (studentsWithInvalidGrades != null && !studentsWithInvalidGrades.isEmpty()) { // let's see if we can give the user additional information. Otherwise, // just use the generic error message if (gradebookService.getGradeEntryType(gradebookUid) == GradebookService.GRADE_TYPE_LETTER) { setErrorMessage(getResourceBundleString(GRADE_INVALID_GENERIC)); return false; } for (String studentId : studentsWithInvalidGrades) { String grade = studentIdToGradeMap.get(studentId); if(!isNumber(grade)) { setErrorMessage(getResourceBundleString(GRADE_GREATER_ZERO)); return false; } else if(!isFewerDigit(grade)) { setErrorMessage(getResourceBundleString(GRADE_DECIMAL_WARN)); return false; } } // if we made it this far, just use the generic message setErrorMessage(getResourceBundleString(GRADE_INVALID_GENERIC)); return false; } return validated; } private void setErrorMessage(String errorMsg) { LOG.debug("setErrorMessage(String " + errorMsg + ")"); FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, getResourceBundleString(ALERT) + errorMsg, null)); } private void setSuccessMessage(String successMsg) { LOG.debug("setSuccessMessage(String " + successMsg + ")"); FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, successMsg, null)); } private String getContextSiteId() { LOG.debug("getContextSiteId()"); return ("/site/" + ToolManager.getCurrentPlacement().getContext()); } public static boolean isNumber(String validateString) { try { double d = Double.valueOf(validateString).doubleValue(); if(d >= 0) return true; else return false; } catch (NumberFormatException e) { //e.printStackTrace(); return false; } } public boolean isFewerDigit(String validateString) { String stringValue = Double.valueOf(validateString).toString(); if(stringValue.lastIndexOf(".") >= 0) { String subString = stringValue.substring(stringValue.lastIndexOf(".")); if(subString != null && subString.length() > 3) return false; } return true; } public List<SelectItem> getGroups() { if(groups == null){ groups = new ArrayList<SelectItem>(); try{ Site currentSite = SiteService.getSite(ToolManager.getCurrentPlacement().getContext()); if(currentSite.hasGroups()){ groups.add(new SelectItem(DEFAULT_GB_ITEM, getResourceBundleString(DEFAULT_ALL_GROUPS))); Collection siteGroups = currentSite.getGroups(); for (Iterator groupIterator = siteGroups.iterator(); groupIterator.hasNext();){ Group currentGroup = (Group) groupIterator.next(); groups.add(new SelectItem(currentGroup.getId(), currentGroup.getTitle())); } } }catch (IdUnusedException e){ LOG.error(e); } } return groups; } public void setGroups(List<SelectItem> groups) { this.groups = groups; } public String getSelectedGroup() { return selectedGroup; } public void setSelectedGroup(String selectedGroup) { this.selectedGroup = selectedGroup; } private class DecoratedUser{ private String id; private String name; public DecoratedUser(String id, String name){ this.id = id; this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } }