/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/msgcntr/trunk/messageforums-app/src/java/org/sakaiproject/tool/messageforums/PrivateMessagesTool.java $
* $Id: PrivateMessagesTool.java 9227 2006-05-15 15:02:42Z cwen@iupui.edu $
***********************************************************************************
*
* 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;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.Locale;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TimeZone;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
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 javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.validator.EmailValidator;
import org.sakaiproject.api.app.messageforums.Area;
import org.sakaiproject.api.app.messageforums.Attachment;
import org.sakaiproject.api.app.messageforums.DBMembershipItem;
import org.sakaiproject.api.app.messageforums.DefaultPermissionsManager;
import org.sakaiproject.api.app.messageforums.DiscussionForumService;
import org.sakaiproject.api.app.messageforums.HiddenGroup;
import org.sakaiproject.api.app.messageforums.MembershipManager;
import org.sakaiproject.api.app.messageforums.Message;
import org.sakaiproject.api.app.messageforums.MessageForumsForumManager;
import org.sakaiproject.api.app.messageforums.MessageForumsMessageManager;
import org.sakaiproject.api.app.messageforums.MessageForumsTypeManager;
import org.sakaiproject.api.app.messageforums.PrivateForum;
import org.sakaiproject.api.app.messageforums.PrivateMessage;
import org.sakaiproject.api.app.messageforums.PrivateMessageRecipient;
import org.sakaiproject.api.app.messageforums.PrivateTopic;
import org.sakaiproject.api.app.messageforums.SynopticMsgcntrManager;
import org.sakaiproject.api.app.messageforums.Topic;
import org.sakaiproject.api.app.messageforums.UserPreferencesManager;
import org.sakaiproject.api.app.messageforums.ui.PrivateMessageManager;
import org.sakaiproject.authz.api.Member;
import org.sakaiproject.authz.api.PermissionsHelper;
import org.sakaiproject.authz.cover.SecurityService;
import org.sakaiproject.component.app.messageforums.MembershipItem;
import org.sakaiproject.component.app.messageforums.dao.hibernate.HiddenGroupImpl;
import org.sakaiproject.component.app.messageforums.dao.hibernate.PrivateMessageImpl;
import org.sakaiproject.component.app.messageforums.dao.hibernate.PrivateTopicImpl;
import org.sakaiproject.component.cover.ComponentManager;
import org.sakaiproject.component.cover.ServerConfigurationService;
import org.sakaiproject.content.api.ContentHostingService;
import org.sakaiproject.content.api.FilePickerHelper;
import org.sakaiproject.entity.api.Reference;
import org.sakaiproject.event.api.Event;
import org.sakaiproject.event.api.LearningResourceStoreService;
import org.sakaiproject.event.api.LearningResourceStoreService.LRS_Actor;
import org.sakaiproject.event.api.LearningResourceStoreService.LRS_Object;
import org.sakaiproject.event.api.LearningResourceStoreService.LRS_Statement;
import org.sakaiproject.event.api.LearningResourceStoreService.LRS_Verb;
import org.sakaiproject.event.api.LearningResourceStoreService.LRS_Verb.SAKAI_VERB;
import org.sakaiproject.event.cover.EventTrackingService;
import org.sakaiproject.exception.IdUnusedException;
import org.sakaiproject.site.api.Group;
import org.sakaiproject.site.api.Site;
import org.sakaiproject.site.cover.SiteService;
import org.sakaiproject.time.cover.TimeService;
import org.sakaiproject.tool.api.ToolSession;
import org.sakaiproject.tool.api.Session;
import org.sakaiproject.tool.cover.SessionManager;
import org.sakaiproject.tool.cover.ToolManager;
import org.sakaiproject.tool.messageforums.ui.DecoratedAttachment;
import org.sakaiproject.tool.messageforums.ui.PermissionBean;
import org.sakaiproject.tool.messageforums.ui.PrivateForumDecoratedBean;
import org.sakaiproject.tool.messageforums.ui.PrivateMessageDecoratedBean;
import org.sakaiproject.tool.messageforums.ui.PrivateTopicDecoratedBean;
import org.sakaiproject.user.api.User;
import org.sakaiproject.user.api.UserNotDefinedException;
import org.sakaiproject.user.cover.UserDirectoryService;
import org.sakaiproject.util.FormattedText;
import org.sakaiproject.util.ResourceLoader;
import org.sakaiproject.util.Validator;
import org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException;
public class PrivateMessagesTool
{
private static final Log LOG = LogFactory.getLog(PrivateMessagesTool.class);
private static final String MESSAGECENTER_PRIVACY_URL = "messagecenter.privacy.url";
private static final String MESSAGECENTER_PRIVACY_TEXT = "messagecenter.privacy.text";
private static final String MESSAGECENTER_BUNDLE = "org.sakaiproject.api.app.messagecenter.bundle.Messages";
private static final String PERMISSIONS_BUNDLE = "org.sakaiproject.api.app.messagecenter.bundle.permissions";
private static final ResourceLoader rb = new ResourceLoader(MESSAGECENTER_BUNDLE);
/**
* List individual private messages details
*/
private static final String REPLY_SUBJECT_PREFIX = "pvt_reply_prefix";
private static final String FORWARD_SUBJECT_PREFIX = "pvt_forward_prefix";
//sakai-reply allF
private static final String ReplyAll_SUBJECT_PREFIX = "pvt_replyall_prefix";
private static final String ALERT = "pvt_alert";
private static final String NO_MATCH_FOUND = "pvt_no_match_found";
private static final String MISSING_BEG_END_DATE = "pvt_missing_date_range";
private static final String CREATE_DIFF_FOLDER_NAME = "pvt_create_diff_folder_name";
private static final String FOLDER_NAME_BLANK = "pvt_folder_name_blank";
private static final String ENTER_FOLDER_NAME = "pvt_enter_new_folder_name";
private static final String ENTER_SHORTER_NAME = "pvt_enter_shorter_folder_name";
private static final String CONFIRM_FOLDER_DELETE = "pvt_delete_folder_confirm";
private static final String CANNOT_DEL_REVISE_FOLDER = "pvt_no_delete_revise_folder";
private static final String PROVIDE_VALID_EMAIL = "pvt_provide_email_addr";
private static final String CONFIRM_PERM_MSG_DELETE = "pvt_confirm_perm_msg_delete";
private static final String SELECT_MSGS_TO_DELETE = "pvt_select_msgs_to_delete";
private static final String SELECT_RECIPIENT_LIST_FOR_REPLY = "pvt_select_reply_recipients_list";
private static final String MISSING_SUBJECT = "pvt_missing_subject";
private static final String MISSING_SUBJECT_DRAFT = "pvt_missing_subject_draft";
private static final String SELECT_MSG_RECIPIENT = "pvt_select_msg_recipient";
private static final String MULTIPLE_WINDOWS = "pvt_multiple_windows";
private static final String CONFIRM_MSG_DELETE = "pvt_confirm_msg_delete";
private static final String ENTER_SEARCH_TEXT = "pvt_enter_search_text";
private static final String MOVE_MSG_ERROR = "pvt_move_msg_error";
private static final String NO_MARKED_READ_MESSAGE = "pvt_no_message_mark_read";
private static final String NO_MARKED_DELETE_MESSAGE = "pvt_no_message_mark_delete";
private static final String NO_MARKED_MOVE_MESSAGE = "pvt_no_message_mark_move";
private static final String MULTIDELETE_SUCCESS_MSG = "pvt_deleted_success";
private static final String PERM_DELETE_SUCCESS_MSG = "pvt_perm_deleted_success";
public static final String RECIPIENTS_UNDISCLOSED = "pvt_bccUndisclosed";
/** Used to determine if this is combined tool or not */
private static final String MESSAGECENTER_TOOL_ID = "sakai.messagecenter";
private static final String MESSAGECENTER_HELPER_TOOL_ID = "sakai.messageforums.helper";
private static final String MESSAGES_TOOL_ID = "sakai.messages";
private static final String FORUMS_TOOL_ID = "sakai.forums";
/**
*Dependency Injected
*/
private PrivateMessageManager prtMsgManager;
private MessageForumsMessageManager messageManager;
private MessageForumsForumManager forumManager;
private ErrorMessages errorMessages;
private MembershipManager membershipManager;
private SynopticMsgcntrManager synopticMsgcntrManager;
private UserPreferencesManager userPreferencesManager;
/** Dependency Injected */
private MessageForumsTypeManager typeManager;
private ContentHostingService contentHostingService;
/** Navigation for JSP */
public static final String MAIN_PG="main";
public static final String DISPLAY_MESSAGES_PG="pvtMsg";
public static final String SELECTED_MESSAGE_PG="pvtMsgDetail";
public static final String COMPOSE_MSG_PG="compose";
public static final String COMPOSE_FROM_PG="msgForum:mainOrHp";
public static final String MESSAGE_SETTING_PG="pvtMsgSettings";
public static final String MESSAGE_FOLDER_SETTING_PG="pvtMsgFolderSettings";
public static final String SEARCH_RESULT_MESSAGES_PG="pvtMsgEx";
public static final String DELETE_MESSAGES_PG="pvtMsgDelete";
public static final String DELETE_FOLDER_PG="pvtMsgFolderDelete";
public static final String MESSAGE_STATISTICS_PG="pvtMsgStatistics";
public static final String MESSAGE_HOME_PG="pvtMsgHpView";
public static final String MESSAGE_REPLY_PG="pvtMsgReply";
public static final String MESSAGE_FORWARD_PG="pvtMsgForward";
//sakai-huxt pvtMsgReplyAll
public static final String MESSAGE_ReplyAll_PG="pvtMsgReplyAll";
public static final String DELETE_MESSAGE_PG="pvtMsgDelete";
public static final String REVISE_FOLDER_PG="pvtMsgFolderRevise";
public static final String MOVE_MESSAGE_PG="pvtMsgMove";
public static final String ADD_FOLDER_IN_FOLDER_PG="pvtMsgFolderInFolderAdd";
public static final String ADD_MESSAGE_FOLDER_PG="pvtMsgFolderAdd";
public static final String PVTMSG_COMPOSE = "pvtMsgCompose";
//need to modified to support internationalization by huxt
/** portlet configuration parameter values**/
public static final String PVTMSG_MODE_RECEIVED = "pvt_received";
public static final String PVTMSG_MODE_SENT = "pvt_sent";
public static final String PVTMSG_MODE_DELETE = "pvt_deleted";
public static final String PVTMSG_MODE_DRAFT = "pvt_drafts";
public static final String PVTMSG_MODE_CASE = "Personal Folders";
public static final String RECIPIANTS_ENTIRE_CLASS= "All Participants";
public static final String RECIPIANTS_ALL_INSTRUCTORS= "All Instructors";
public static final String SET_AS_YES="yes";
public static final String SET_AS_NO="no";
public static final String THREADED_VIEW = "threaded";
//huxt
public static final String EXTERNAL_TOPIC_ID = "pvtMsgTopicId";
public static final String EXTERNAL_WHICH_TOPIC = "selectedTopic";
PrivateForumDecoratedBean decoratedForum;
private List aggregateList = new ArrayList();
private Area area;
private PrivateForum forum;
private List<PrivateTopic> pvtTopics=new ArrayList<PrivateTopic>();
private List decoratedPvtMsgs;
//huxt
private String msgNavMode="privateMessages" ;//============
private PrivateMessageDecoratedBean detailMsg ;
private boolean viewChanged = false;
private String currentMsgUuid; //this is the message which is being currently edited/displayed/deleted
private List selectedItems;
private String userName; //current user
private Date time ; //current time
//delete confirmation screen - single delete
private boolean deleteConfirm=false ; //used for displaying delete confirmation message in same jsp
private boolean validEmail=true ;
//Compose Screen-webpage
private List selectedComposeToList = new ArrayList();
private List selectedComposeBccList = new ArrayList();
private String composeSendAsPvtMsg=SET_AS_YES; // currently set as Default as change by user is allowed
private boolean booleanEmailOut= Boolean.parseBoolean(ServerConfigurationService.getString("mc.messages.ccEmailDefault", "false"));
private String composeSubject ;
private String composeBody;
private String selectedLabel="pvt_priority_normal" ; //defautl set
private List totalComposeToList = null;
private List totalComposeToBccList = null;
private List totalComposeToListRecipients;
//Delete items - Checkbox display and selection - Multiple delete
private List selectedDeleteItems;
private boolean multiDeleteSuccess;
private String multiDeleteSuccessMsg;
private List totalDisplayItems=new ArrayList();
// Move to folder - Checkbox display and selection - Multiple move to folder
private List selectedMoveToFolderItems;
//reply to
private String replyToBody;
private String replyToSubject;
//forwarding
private String forwardBody;
private String forwardSubject;
//reply to all-huxt
private String replyToAllBody;
private String replyToAllSubject;
//Setting Screen
private String activatePvtMsg=SET_AS_NO;
private String forwardPvtMsg=SET_AS_NO;
private String forwardPvtMsgEmail;
private boolean superUser;
private String sendToEmail;
//message header screen
private String searchText="";
private String selectView;
//return to previous page after send msg
private String fromMainOrHp = null;
// for compose, are we coming from main page?
private boolean fromMain;
// Message which will be marked as replied
private PrivateMessage replyingMessage;
//////////////////////
//=====================need to be modified to support internationalization - by huxt
/** The configuration mode, received, sent,delete, case etc ... */
public static final String STATE_PVTMSG_MODE = "pvtmsg.mode";
private Map courseMemberMap;
public static final String SORT_SUBJECT_ASC = "subject_asc";
public static final String SORT_SUBJECT_DESC = "subject_desc";
public static final String SORT_AUTHOR_ASC = "author_asc";
public static final String SORT_AUTHOR_DESC = "author_desc";
public static final String SORT_DATE_ASC = "date_asc";
public static final String SORT_DATE_DESC = "date_desc";
public static final String SORT_LABEL_ASC = "label_asc";
public static final String SORT_LABEL_DESC = "label_desc";
public static final String SORT_TO_ASC = "to_asc";
public static final String SORT_TO_DESC = "to_desc";
public static final String SORT_ATTACHMENT_ASC = "attachment_asc";
public static final String SORT_ATTACHMENT_DESC = "attachment_desc";
private boolean selectedComposedlistequalCurrentuser=false;
/** sort member */
private String sortType = SORT_DATE_DESC;
private int setDetailMsgCount = 0;
private static final String PERMISSIONS_PREFIX = "msg.";
private boolean instructor = false;
private List<SelectItem> nonHiddenGroups = new ArrayList<SelectItem>();
private List<HiddenGroup> hiddenGroups = new ArrayList();
private static final String DEFAULT_NON_HIDDEN_GROUP_ID = "-1";
private String DEFAULT_NON_HIDDEN_GROUP_TITLE = "hiddenGroups_selectGroup";
private String selectedNonHiddenGroup = DEFAULT_NON_HIDDEN_GROUP_ID;
private static final String PARAM_GROUP_ID = "groupId";
private boolean currentSiteHasGroups = false;
private Boolean displayHiddenGroupsMsg = null;
private boolean showProfileInfoMsg = false;
private boolean showProfileLink = false;
public PrivateMessagesTool()
{
showProfileInfoMsg = ServerConfigurationService.getBoolean("msgcntr.messages.showProfileInfo", false);
showProfileLink = showProfileInfoMsg && ServerConfigurationService.getBoolean("profile2.profile.link.enabled", true);
}
/**
* @return
*/
public MessageForumsTypeManager getTypeManager()
{
return typeManager;
}
/**
* @param prtMsgManager
*/
public void setPrtMsgManager(PrivateMessageManager prtMsgManager)
{
this.prtMsgManager = prtMsgManager;
}
/**
* @param messageManager
*/
public void setMessageManager(MessageForumsMessageManager messageManager)
{
this.messageManager = messageManager;
}
/**
* @param membershipManager
*/
public void setMembershipManager(MembershipManager membershipManager)
{
this.membershipManager = membershipManager;
}
/**
* @param typeManager
*/
public void setTypeManager(MessageForumsTypeManager typeManager)
{
this.typeManager = typeManager;
}
public void initializePrivateMessageArea()
{
/** get area per request */
area = prtMsgManager.getPrivateMessageArea();
if (! area.getEnabled() && isMessages()) {
area.setEnabled(true);
}
// reset these in case the allowed recipients (such as hidden groups) was updated
totalComposeToList = null;
totalComposeToBccList = null;
displayHiddenGroupsMsg = null;
if (getUserId() != null && (getPvtAreaEnabled() || isInstructor() || isEmailPermit())){
PrivateForum pf = prtMsgManager.initializePrivateMessageArea(area, aggregateList);
pf = prtMsgManager.initializationHelper(pf, area);
pvtTopics = pf.getTopics();
Collections.sort(pvtTopics, PrivateTopicImpl.TITLE_COMPARATOR); //changed to date comparator
forum=pf;
activatePvtMsg = (Boolean.TRUE.equals(area.getEnabled())) ? SET_AS_YES : SET_AS_NO;
sendToEmail = area.getSendToEmail() + "";
forwardPvtMsg = (Boolean.TRUE.equals(pf.getAutoForward())) ? SET_AS_YES : SET_AS_NO;
forwardPvtMsgEmail = pf.getAutoForwardEmail();
hiddenGroups = new ArrayList<HiddenGroup>();
if(area != null && area.getHiddenGroups() != null){
for(Iterator itor = area.getHiddenGroups().iterator(); itor.hasNext();){
HiddenGroup group = (HiddenGroup) itor.next();
hiddenGroups.add(group);
}
}
}
}
/**
* Property created rather than setErrorMessage for design requirement
* @return
*/
public boolean isDispError()
{
if (isInstructor() && !getPvtAreaEnabled())
{
return true;
}
else
{
return false;
}
}
public boolean getPvtAreaEnabled()
{
if(area == null) {
initializePrivateMessageArea();
}
return area.getEnabled().booleanValue();
}
/**
*
* @return true if a copy of the message is always sent to the recipient email address(es)
* per the site-wide setting
*/
public boolean isEmailCopyAlways() {
if (area == null) {
initializePrivateMessageArea();
}
return !isEmailCopyDisabled() && area.getSendToEmail() == Area.EMAIL_COPY_ALWAYS;
}
public boolean isEmailCopyDisabled(){
return ServerConfigurationService.getBoolean("mc.messages.ccEmailDisabled", false);
}
/**
*
* @return true if the sender may choose whether a copy of the message is sent to recipient
* email address(es)
*/
public boolean isEmailCopyOptional() {
if (area == null) {
initializePrivateMessageArea();
}
return !isEmailCopyDisabled() && area.getSendToEmail() == Area.EMAIL_COPY_OPTIONAL;
}
public boolean isEmailForwardDisabled(){
return ServerConfigurationService.getBoolean("mc.messages.forwardEmailDisabled", false);
}
public boolean isShowSettingsLink(){
if(isInstructor()){
//if the site has groups, then show the settings link b/c there
//are settings for groups
if(getCurrentSiteHasGroups()){
return true;
}else{
//if no groups and all email settings are disabled, there's no
//settings to show, so don't show the link
return !isEmailForwardDisabled() || !isEmailCopyDisabled();
}
}else{
//students only see forward options, if it's hidden, don't show this link
return !isEmailForwardDisabled();
}
}
//Return decorated Forum
public PrivateForumDecoratedBean getDecoratedForum()
{
PrivateForumDecoratedBean decoratedForum = new PrivateForumDecoratedBean(getForum()) ;
/** only load topics/counts if area is enabled */
int totalUnreadMessages = 0;
if (getPvtAreaEnabled() && decoratedForum.getForum() != null){
int countForFolderNum = 0;// only three folder
Iterator<PrivateTopic> iterator = pvtTopics.iterator();
//MSGCNTR-472 we need the first three but need to guard against there being < 3 elements
for (int i = 0;i < 3 && iterator.hasNext(); i++)//only three times
{
PrivateTopic topic = (PrivateTopic) iterator.next();
if (topic != null)
{
/** filter topics by context and type*/
if (topic.getTypeUuid() != null
&& topic.getTypeUuid().equals(typeManager.getUserDefinedPrivateTopicType())
&& topic.getContextId() != null && !topic.getContextId().equals(prtMsgManager.getContextId())){
continue;
}
PrivateTopicDecoratedBean decoTopic= new PrivateTopicDecoratedBean(topic) ;
// folder uuid
String typeUuid = getPrivateMessageTypeFromContext(topic.getTitle());
countForFolderNum++;
decoTopic.setTotalNoMessages(prtMsgManager.findMessageCount(typeUuid, aggregateList));
decoTopic.setUnreadNoMessages(prtMsgManager.findUnreadMessageCount(typeUuid, aggregateList));
totalUnreadMessages += decoTopic.getUnreadNoMessages();
decoratedForum.addTopic(decoTopic);
}
}
while(iterator.hasNext())//add more folders
{
PrivateTopic topic = (PrivateTopic) iterator.next();
if (topic != null)
{
/** filter topics by context and type*/
if (topic.getTypeUuid() != null
&& topic.getTypeUuid().equals(typeManager.getUserDefinedPrivateTopicType())
&& topic.getContextId() != null && !topic.getContextId().equals(prtMsgManager.getContextId())){
continue;
}
PrivateTopicDecoratedBean decoTopic= new PrivateTopicDecoratedBean(topic) ;
String typeUuid = getPrivateMessageTypeFromContext(topic.getTitle());
decoTopic.setTotalNoMessages(prtMsgManager.findMessageCount(typeUuid, aggregateList));
decoTopic.setUnreadNoMessages(prtMsgManager.findUnreadMessageCount(typeUuid,aggregateList));
totalUnreadMessages += decoTopic.getUnreadNoMessages();
decoratedForum.addTopic(decoTopic);
}
}
}//if getPvtAreaEnabled()
//update syntopic info:
if(getUserId() != null){
setMessagesSynopticInfoHelper(getUserId(), getSiteId(), totalUnreadMessages, SynopticMsgcntrManager.NUM_OF_ATTEMPTS);
}
return decoratedForum ;
}
public void setMessagesSynopticInfoHelper(String userId, String siteId, int unreadMessagesCount, int numOfAttempts) {
try {
getSynopticMsgcntrManager().setMessagesSynopticInfoHelper(userId, siteId, unreadMessagesCount);
} catch (HibernateOptimisticLockingFailureException holfe) {
// failed, so wait and try again
try {
Thread.sleep(SynopticMsgcntrManager.OPT_LOCK_WAIT);
} catch (InterruptedException e) {
e.printStackTrace();
}
numOfAttempts--;
if (numOfAttempts <= 0) {
System.out
.println("PrivateMessagesTool: setMessagesSynopticInfoHelper: HibernateOptimisticLockingFailureException no more retries left");
holfe.printStackTrace();
} else {
System.out
.println("PrivateMessagesTool: setMessagesSynopticInfoHelper: HibernateOptimisticLockingFailureException: attempts left: "
+ numOfAttempts);
setMessagesSynopticInfoHelper(userId, siteId,
unreadMessagesCount, numOfAttempts);
}
}
}
public List getDecoratedPvtMsgs()
{
/**
avoid apply_request_values and render_response from calling this method on postback
solution -- only call during render_response phase
8/29/07 JLR - if coming from the synoptic tool, we need to process
*/
if (!FacesContext.getCurrentInstance().getRenderResponse() && !viewChanged &&
getExternalParameterByKey(EXTERNAL_WHICH_TOPIC) == null) {
return decoratedPvtMsgs;
}
if(selectView!=null && selectView.equalsIgnoreCase(THREADED_VIEW))
{
this.rearrageTopicMsgsThreaded(false);
return decoratedPvtMsgs;
}
// coming from synoptic view, need to change the msgNavMode
if (msgNavMode == null)
{//=======Recibidios by huxt
msgNavMode = (getExternalParameterByKey(EXTERNAL_WHICH_TOPIC) == null) ? //"selectedTopic"
forumManager.getTopicByUuid(getExternalParameterByKey(EXTERNAL_TOPIC_ID)).getTitle() ://"pvtMsgTopicid"
getExternalParameterByKey(EXTERNAL_WHICH_TOPIC);
}
decoratedPvtMsgs=new ArrayList();
String typeUuid;
typeUuid = getPrivateMessageTypeFromContext(msgNavMode);//=======Recibidios by huxt
/** support for sorting */
/* if the view was changed to "All Messages", we want to retain the previous
* sort setting. Otherwise, the user has selected a different sort setting.
* Also retain sort setting if user has hit "Check All"
*/
if ((!viewChanged || sortType == null) && !selectAll)
{
String sortColumnParameter = getExternalParameterByKey("sortColumn");
if ("subject".equals(sortColumnParameter)){
sortType = (SORT_SUBJECT_ASC.equals(sortType)) ? SORT_SUBJECT_DESC : SORT_SUBJECT_ASC;
}
else if ("author".equals(sortColumnParameter)){
sortType = (SORT_AUTHOR_ASC.equals(sortType)) ? SORT_AUTHOR_DESC : SORT_AUTHOR_ASC;
}
else if ("date".equals(sortColumnParameter)){
sortType = (SORT_DATE_ASC.equals(sortType)) ? SORT_DATE_DESC : SORT_DATE_ASC;
}
else if ("label".equals(sortColumnParameter)){
sortType = (SORT_LABEL_ASC.equals(sortType)) ? SORT_LABEL_DESC : SORT_LABEL_ASC;
}
else if ("to".equals(sortColumnParameter)){
sortType = (SORT_TO_ASC.equals(sortType)) ? SORT_TO_DESC : SORT_TO_ASC;
}
else if ("attachment".equals(sortColumnParameter)){
sortType = (SORT_ATTACHMENT_ASC.equals(sortType)) ? SORT_ATTACHMENT_DESC : SORT_ATTACHMENT_ASC;
}
else{
sortType = SORT_DATE_DESC;
}
}
viewChanged = false;
/** add support for sorting */
if (SORT_SUBJECT_ASC.equals(sortType)){
decoratedPvtMsgs= prtMsgManager.getMessagesByType(typeUuid, PrivateMessageManager.SORT_COLUMN_SUBJECT,
PrivateMessageManager.SORT_ASC);
}
else if (SORT_SUBJECT_DESC.equals(sortType)){
decoratedPvtMsgs= prtMsgManager.getMessagesByType(typeUuid, PrivateMessageManager.SORT_COLUMN_SUBJECT,
PrivateMessageManager.SORT_DESC);
}
else if (SORT_AUTHOR_ASC.equals(sortType)){
decoratedPvtMsgs= prtMsgManager.getMessagesByType(typeUuid, PrivateMessageManager.SORT_COLUMN_AUTHOR,
PrivateMessageManager.SORT_ASC);
}
else if (SORT_AUTHOR_DESC.equals(sortType)){
decoratedPvtMsgs= prtMsgManager.getMessagesByType(typeUuid, PrivateMessageManager.SORT_COLUMN_AUTHOR,
PrivateMessageManager.SORT_DESC);
}
else if (SORT_DATE_ASC.equals(sortType)){
decoratedPvtMsgs= prtMsgManager.getMessagesByType(typeUuid, PrivateMessageManager.SORT_COLUMN_DATE,
PrivateMessageManager.SORT_ASC);
}
else if (SORT_DATE_DESC.equals(sortType)){
decoratedPvtMsgs= prtMsgManager.getMessagesByType(typeUuid, PrivateMessageManager.SORT_COLUMN_DATE,
PrivateMessageManager.SORT_DESC);
}
else if (SORT_LABEL_ASC.equals(sortType)){
decoratedPvtMsgs= prtMsgManager.getMessagesByType(typeUuid, PrivateMessageManager.SORT_COLUMN_LABEL,
PrivateMessageManager.SORT_ASC);
}
else if (SORT_LABEL_DESC.equals(sortType)){
decoratedPvtMsgs= prtMsgManager.getMessagesByType(typeUuid, PrivateMessageManager.SORT_COLUMN_LABEL,
PrivateMessageManager.SORT_DESC);
}
else if (SORT_TO_ASC.equals(sortType)){
// the recipient list is stored as a CLOB in Oracle, so we cannot use the
// db query to obtain the sorted list - cannot order by CLOB
/*decoratedPvtMsgs= prtMsgManager.getMessagesByType(typeUuid, PrivateMessageManager.SORT_COLUMN_TO,
PrivateMessageManager.SORT_ASC);*/
decoratedPvtMsgs= prtMsgManager.getMessagesByType(typeUuid, PrivateMessageManager.SORT_COLUMN_DATE,
PrivateMessageManager.SORT_ASC);
Collections.sort(decoratedPvtMsgs, PrivateMessageImpl.RECIPIENT_LIST_COMPARATOR_ASC);
}
else if (SORT_TO_DESC.equals(sortType)){
// the recipient list is stored as a CLOB in Oracle, so we cannot use the
// db query to obtain the sorted list - cannot order by CLOB
/*decoratedPvtMsgs= prtMsgManager.getMessagesByType(typeUuid, PrivateMessageManager.SORT_COLUMN_TO,
PrivateMessageManager.SORT_DESC);*/
decoratedPvtMsgs= prtMsgManager.getMessagesByType(typeUuid, PrivateMessageManager.SORT_COLUMN_DATE,
PrivateMessageManager.SORT_ASC);
Collections.sort(decoratedPvtMsgs, PrivateMessageImpl.RECIPIENT_LIST_COMPARATOR_DESC);
}
else if (SORT_ATTACHMENT_ASC.equals(sortType)){
decoratedPvtMsgs= prtMsgManager.getMessagesByType(typeUuid, PrivateMessageManager.SORT_COLUMN_ATTACHMENT,
PrivateMessageManager.SORT_ASC);
}
else if (SORT_ATTACHMENT_DESC.equals(sortType)){
decoratedPvtMsgs= prtMsgManager.getMessagesByType(typeUuid, PrivateMessageManager.SORT_COLUMN_ATTACHMENT,
PrivateMessageManager.SORT_DESC);
}
decoratedPvtMsgs = createDecoratedDisplay(decoratedPvtMsgs);
//pre/next message
if(decoratedPvtMsgs != null )
{
setMessageBeanPreNextStatus();
}
return decoratedPvtMsgs ;
}
private void setMessageBeanPreNextStatus()
{
List tempMsgs = decoratedPvtMsgs;
for(int i=0; i<tempMsgs.size(); i++)
{
PrivateMessageDecoratedBean dmb = (PrivateMessageDecoratedBean)tempMsgs.get(i);
if(i==0)
{
dmb.setHasPre(false);
if(i==(tempMsgs.size()-1))
{
dmb.setHasNext(false);
}
else
{
dmb.setHasNext(true);
}
}
else if(i==(tempMsgs.size()-1))
{
dmb.setHasPre(true);
dmb.setHasNext(false);
}
else
{
dmb.setHasNext(true);
dmb.setHasPre(true);
}
}
}
public void setDecoratedPvtMsgs(List displayPvtMsgs)
{
this.decoratedPvtMsgs=displayPvtMsgs;
}
public String getMsgNavMode()
{
return msgNavMode ;
}
public PrivateMessageDecoratedBean getDetailMsg()
{
return detailMsg ;
}
public void setDetailMsg(PrivateMessageDecoratedBean detailMsg)
{
this.detailMsg = detailMsg;
}
public String getCurrentMsgUuid()
{
return currentMsgUuid;
}
public void setCurrentMsgUuid(String currentMsgUuid)
{
this.currentMsgUuid = currentMsgUuid;
}
public List getSelectedItems()
{
return selectedItems;
}
public void setSelectedItems(List selectedItems)
{
this.selectedItems=selectedItems ;
}
public boolean isDeleteConfirm()
{
return deleteConfirm;
}
public void setDeleteConfirm(boolean deleteConfirm)
{
this.deleteConfirm = deleteConfirm;
}
public boolean isValidEmail()
{
return validEmail;
}
public void setValidEmail(boolean validEmail)
{
this.validEmail = validEmail;
}
//Deleted page - checkbox display and selection
public List getSelectedDeleteItems()
{
return selectedDeleteItems;
}
public List getTotalDisplayItems()
{
return totalDisplayItems;
}
public void setTotalDisplayItems(List totalDisplayItems)
{
this.totalDisplayItems = totalDisplayItems;
}
public void setSelectedDeleteItems(List selectedDeleteItems)
{
this.selectedDeleteItems = selectedDeleteItems;
}
//Compose Getter and Setter
public String getComposeBody()
{
return composeBody;
}
public void setComposeBody(String composeBody)
{
this.composeBody = composeBody;
}
public String getSelectedLabel()
{
return selectedLabel;
}
public void setSelectedLabel(String selectedLabel)
{
this.selectedLabel = selectedLabel;
}
public boolean getBooleanEmailOut() {
return booleanEmailOut;
}
public void setBooleanEmailOut(boolean booleanEmailOut) {
this.booleanEmailOut= booleanEmailOut;
}
public PrivateMessage getReplyingMessage() {
return replyingMessage;
}
public void setReplyingMessage(PrivateMessage replyingMessage) {
this.replyingMessage = replyingMessage;
}
/**
*
* @return true if the Messages tool setting in combination with the author-defined
* {@link #getBooleanEmailOut()} setting requires a copy of the message to be sent to
* recipient(s) email
*/
public boolean isSendEmail() {
boolean sendEmail;
if (isEmailCopyAlways() ||
(isEmailCopyOptional() && getBooleanEmailOut())) {
sendEmail = true;
} else {
sendEmail = false;
}
return sendEmail;
}
public String getComposeSendAsPvtMsg()
{
return composeSendAsPvtMsg;
}
public void setComposeSendAsPvtMsg(String composeSendAsPvtMsg)
{
this.composeSendAsPvtMsg = composeSendAsPvtMsg;
}
public String getComposeSubject()
{
return composeSubject;
}
public void setComposeSubject(String composeSubject)
{
this.composeSubject = composeSubject;
}
public void setSelectedComposeToList(List selectedComposeToList)
{
this.selectedComposeToList = selectedComposeToList;
}
public void setSelectedComposeBccList(List selectedComposeBccList)
{
this.selectedComposeBccList = selectedComposeBccList;
}
public void setTotalComposeToList(List totalComposeToList)
{
this.totalComposeToList = totalComposeToList;
}
public List getSelectedComposeToList()
{
return selectedComposeToList;
}
public List getSelectedComposeBccList()
{
return selectedComposeBccList;
}
private String getSiteTitle(){
try {
return SiteService.getSite(ToolManager.getCurrentPlacement().getContext()).getTitle();
} catch (IdUnusedException e) {
e.printStackTrace();
}
return "";
}
private String getSiteId() {
return ToolManager.getCurrentPlacement().getContext();
}
private String getContextSiteId()
{
return "/site/" + ToolManager.getCurrentPlacement().getContext();
}
public List getTotalComposeToList()
{
if (totalComposeToList == null) {
initializeComposeToLists();
}
List<SelectItem> selectItemList = new ArrayList<SelectItem>();
for (Iterator i = totalComposeToList.iterator(); i.hasNext();) {
MembershipItem item = (MembershipItem) i.next();
selectItemList.add(new SelectItem(item.getId(), item.getName()));
}
return selectItemList;
}
public List getTotalComposeToBccList() {
if (totalComposeToBccList == null) {
initializeComposeToLists();
}
List<SelectItem> selectItemList = new ArrayList<SelectItem>();
for (Iterator i = totalComposeToBccList.iterator(); i.hasNext();) {
MembershipItem item = (MembershipItem) i.next();
selectItemList.add(new SelectItem(item.getId(), item.getName()));
}
return selectItemList;
}
/**
* Since the courseMemberMap generates new uuids each time it is called, and
* these uuids are used to identify the recipients of the message when the user
* sends the message, we need to do the logic for the "To" and "Bcc" lists together,
* utilizing the same courseMemberMap. This will set the values for the
* totalComposeToList and totalComposeToBccList.
*/
private void initializeComposeToLists() {
totalComposeToList = new ArrayList();
totalComposeToBccList = new ArrayList();
List<String> hiddenGroupIds = getHiddenGroupIds(area.getHiddenGroups());
courseMemberMap = membershipManager.getFilteredCourseMembers(true, getHiddenGroupIds(area.getHiddenGroups()));
List members = membershipManager.convertMemberMapToList(courseMemberMap);
List<SelectItem> selectItemList = new ArrayList<SelectItem>();
// we need to filter out the hidden groups since they will only appear as recipients in the bcc list
for (Iterator i = members.iterator(); i.hasNext();) {
MembershipItem item = (MembershipItem) i.next();
if (hiddenGroupIds != null && item.getGroup() != null && hiddenGroupIds.contains(item.getGroup().getTitle())) {
// hidden groups only appear in the bcc list
totalComposeToBccList.add(item);
} else {
totalComposeToList.add(item);
totalComposeToBccList.add(item);
}
}
}
public boolean isDisplayHiddenGroupsMsg() {
if (displayHiddenGroupsMsg == null) {
displayHiddenGroupsMsg = hiddenGroups != null && !hiddenGroups.isEmpty() && prtMsgManager.isAllowToViewHiddenGroups();
}
return displayHiddenGroupsMsg;
}
private List<String> getHiddenGroupIds(Set hiddenGroups){
List<String> returnList = new ArrayList<String>();
if(hiddenGroups != null){
for(Iterator itor = hiddenGroups.iterator(); itor.hasNext();){
HiddenGroup group = (HiddenGroup) itor.next();
returnList.add(group.getGroupId());
}
}
return returnList;
}
/**
*
* @param id
* @return
*/
public String getUserSortNameById(String id){
try
{
User user=UserDirectoryService.getUser(id) ;
if (ServerConfigurationService.getBoolean("msg.displayEid", true))
{
userName= user.getSortName() + " (" + user.getDisplayId() + ")";
}
else
{
userName= user.getSortName();
}
}
catch (UserNotDefinedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return userName;
}
public String getUserName() {
String userId=SessionManager.getCurrentSessionUserId();
try
{
User user=UserDirectoryService.getUser(userId) ;
if (ServerConfigurationService.getBoolean("msg.displayEid", true))
{
userName= user.getDisplayName() + " (" + user.getDisplayId() + ")";
}
else {
userName= user.getDisplayName();
}
}
catch (UserNotDefinedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return userName;
}
public String getUserId()
{
return SessionManager.getCurrentSessionUserId();
}
public TimeZone getUserTimeZone() {
return userPreferencesManager.getTimeZone();
}
//Reply time
public Date getTime()
{
return new Date();
}
//Reply to page
public String getReplyToBody() {
return replyToBody;
}
public void setReplyToBody(String replyToBody) {
this.replyToBody=replyToBody;
}
public String getReplyToSubject()
{
return replyToSubject;
}
public void setReplyToSubject(String replyToSubject)
{
this.replyToSubject = replyToSubject;
}
// Forward a message
public String getForwardBody() {
return forwardBody;
}
public void setForwardBody(String forwardBody) {
this.forwardBody=forwardBody;
}
public String getForwardSubject()
{
return forwardSubject;
}
public void setForwardSubject(String forwardSubject)
{
this.forwardSubject = forwardSubject;
}
//message header Getter
public String getSearchText()
{
return searchText ;
}
public void setSearchText(String searchText)
{
this.searchText=searchText;
}
public String getSelectView()
{
return selectView ;
}
public void setSelectView(String selectView)
{
this.selectView=selectView ;
}
public boolean isMultiDeleteSuccess()
{
return multiDeleteSuccess;
}
public void setMultiDeleteSuccess(boolean multiDeleteSuccess)
{
this.multiDeleteSuccess = multiDeleteSuccess;
}
public String getMultiDeleteSuccessMsg()
{
return multiDeleteSuccessMsg;
}
public void setMultiDeleteSuccessMsg(String multiDeleteSuccessMsg)
{
this.multiDeleteSuccessMsg = multiDeleteSuccessMsg;
}
public boolean isFromMain() {
return fromMain;
}
public String getServerUrl() {
return ServerConfigurationService.getServerUrl();
}
public boolean getShowProfileInfoMsg() {
return showProfileInfoMsg;
}
public boolean getShowProfileLink() {
return showProfileLink;
}
public void processChangeSelectView(ValueChangeEvent eve)
{
multiDeleteSuccess = false;
String currentValue = (String) eve.getNewValue();
if (!currentValue.equalsIgnoreCase(THREADED_VIEW) && selectView != null && selectView.equals(THREADED_VIEW))
{
selectView = "";
viewChanged = true;
getDecoratedPvtMsgs();
return;
}
else if (currentValue.equalsIgnoreCase(THREADED_VIEW))
{
selectView = THREADED_VIEW;
if (searchPvtMsgs != null && !searchPvtMsgs.isEmpty())
this.rearrageTopicMsgsThreaded(true);
else
this.rearrageTopicMsgsThreaded(false);
return;
}
}
public void rearrageTopicMsgsThreaded(boolean searcModeOn)
{
List msgsList = new ArrayList();
if(searcModeOn)
{
for(int i=0; i<searchPvtMsgs.size(); i++)
{
msgsList.add((PrivateMessageDecoratedBean)searchPvtMsgs.get(i));
}
searchPvtMsgs.clear();
}else
{
// always start with the decorated pm in ascending date order
String typeUuid = getPrivateMessageTypeFromContext(msgNavMode);
decoratedPvtMsgs= prtMsgManager.getMessagesByType(typeUuid, PrivateMessageManager.SORT_COLUMN_DATE,
PrivateMessageManager.SORT_ASC);
decoratedPvtMsgs = createDecoratedDisplay(decoratedPvtMsgs);
for(int i=0; i<decoratedPvtMsgs.size(); i++)
{
msgsList.add((PrivateMessageDecoratedBean)decoratedPvtMsgs.get(i));
}
decoratedPvtMsgs.clear();
}
if(msgsList != null)
{
List tempMsgsList = new ArrayList();
for(int i=0; i<msgsList.size(); i++)
{
tempMsgsList.add((PrivateMessageDecoratedBean)msgsList.get(i));
}
Iterator iter = tempMsgsList.iterator();
while(iter.hasNext())
{
List allRelatedMsgs = messageManager.getAllRelatedMsgs(
((PrivateMessageDecoratedBean)iter.next()).getMsg().getId());
List currentRelatedMsgs = new ArrayList();
if(allRelatedMsgs != null && allRelatedMsgs.size()>0)
{
Long msgId = ((Message)allRelatedMsgs.get(0)).getId();
PrivateMessage pvtMsg= (PrivateMessage) prtMsgManager.getMessageById(msgId);
PrivateMessageDecoratedBean pdb = new PrivateMessageDecoratedBean(pvtMsg);
pdb.setDepth(-1);
boolean firstEleAdded = false;
for(int i=0; i<msgsList.size(); i++)
{
PrivateMessageDecoratedBean tempPMDB = (PrivateMessageDecoratedBean)msgsList.get(i);
if (tempPMDB.getMsg().getId().equals(pdb.getMsg().getId()))
{
tempPMDB.setDepth(0);
currentRelatedMsgs.add(tempPMDB);
firstEleAdded = true;
recursiveGetThreadedMsgsFromList(msgsList, allRelatedMsgs, currentRelatedMsgs, tempPMDB);
break;
}
}
if(!firstEleAdded)
recursiveGetThreadedMsgsFromList(msgsList, allRelatedMsgs, currentRelatedMsgs, pdb);
}
for(int i=0; i<currentRelatedMsgs.size(); i++)
{
if(searcModeOn)
{
searchPvtMsgs.add((PrivateMessageDecoratedBean)currentRelatedMsgs.get(i));
}else
{
decoratedPvtMsgs.add((PrivateMessageDecoratedBean)currentRelatedMsgs.get(i));
}
tempMsgsList.remove((PrivateMessageDecoratedBean)currentRelatedMsgs.get(i));
}
iter = tempMsgsList.iterator();
}
}
setMessageBeanPreNextStatus();
}
private void recursiveGetThreadedMsgsFromList(List msgsList,
List allRelatedMsgs, List returnList,
PrivateMessageDecoratedBean currentMsg)
{
for (int i = 0; i < allRelatedMsgs.size(); i++)
{
Long msgId = ((Message)allRelatedMsgs.get(i)).getId();
PrivateMessage pvtMsg= (PrivateMessage) prtMsgManager.getMessageById(msgId);
PrivateMessageDecoratedBean thisMsgBean = new PrivateMessageDecoratedBean(pvtMsg);
Message thisMsg = thisMsgBean.getMsg();
boolean existedInCurrentUserList = false;
for(int j=0; j< msgsList.size(); j++)
{
PrivateMessageDecoratedBean currentUserBean =
(PrivateMessageDecoratedBean)msgsList.get(j);
if (thisMsg.getInReplyTo() != null
&& thisMsg.getInReplyTo().getId().equals(
currentMsg.getMsg().getId())
&& currentUserBean.getMsg().getId().equals(thisMsg.getId()))
{
currentUserBean.setDepth(currentMsg.getDepth() + 1);
if(currentMsg.getDepth() > -1)
{
currentUserBean.setUiInReply(((PrivateMessageDecoratedBean)returnList.get(returnList.size()-1)).getMsg());
}
returnList.add(currentUserBean);
existedInCurrentUserList = true;
recursiveGetThreadedMsgsFromList(msgsList, allRelatedMsgs, returnList, currentUserBean);
break;
}
}
if(!existedInCurrentUserList)
{
if(thisMsg.getInReplyTo() != null
&& thisMsg.getInReplyTo().getId().equals(
currentMsg.getMsg().getId()))
{
thisMsgBean.setDepth(currentMsg.getDepth());
recursiveGetThreadedMsgsFromList(msgsList, allRelatedMsgs, returnList, thisMsgBean);
}
}
}
}
//////////////////////////////////////////////////////////////////////////////////
/**
* called when any topic like Received/Sent/Deleted clicked
* @return - pvtMsg
*/
private String selectedTopicTitle="";
private String selectedTopicId="";
public String getSelectedTopicTitle()
{
return selectedTopicTitle ;
}
public void setSelectedTopicTitle(String selectedTopicTitle)
{
this.selectedTopicTitle=selectedTopicTitle;
}
public String getSelectedTopicId()
{
return selectedTopicId;
}
public void setSelectedTopicId(String selectedTopicId)
{
this.selectedTopicId=selectedTopicId;
}
public String processActionHome()
{
LOG.debug("processActionHome()");
msgNavMode = "privateMessages";
multiDeleteSuccess = false;
if (searchPvtMsgs != null)
searchPvtMsgs.clear();
return MAIN_PG;
}
public String processActionPrivateMessages()
{
LOG.debug("processActionPrivateMessages()");
msgNavMode = "privateMessages";
multiDeleteSuccess = false;
if (searchPvtMsgs != null)
searchPvtMsgs.clear();
return MESSAGE_HOME_PG;
}
public String processDisplayForum()
{
LOG.debug("processDisplayForum()");
if (searchPvtMsgs != null)
searchPvtMsgs.clear();
return DISPLAY_MESSAGES_PG;
}
public String processDisplayMessages()
{
LOG.debug("processDisplayMessages()");
if (searchPvtMsgs != null)
searchPvtMsgs.clear();
return SELECTED_MESSAGE_PG;
}
public void initializeFromSynoptic()
{
if(getUserId() != null){
/** reset sort type */
sortType = SORT_DATE_DESC;
setSelectedTopicId(getExternalParameterByKey(EXTERNAL_TOPIC_ID));
selectedTopic = new PrivateTopicDecoratedBean(forumManager.getTopicByUuid(getExternalParameterByKey(EXTERNAL_TOPIC_ID)));
selectedTopicTitle = getExternalParameterByKey(EXTERNAL_WHICH_TOPIC);
//set prev/next topic details
PrivateForum pf = forumManager.getPrivateForumByOwnerAreaNullWithAllTopics(getUserId());
if (pf == null)
{
initializePrivateMessageArea();
}
else
{
pvtTopics = pf.getTopics();
forum = pf;
}
msgNavMode=getSelectedTopicTitle();
//set prev/next topic details
setPrevNextTopicDetails(msgNavMode);
}
}
public String processPvtMsgTopic()
{
LOG.debug("processPvtMsgTopic()");
/** reset sort type */
sortType = SORT_DATE_DESC;
setSelectedTopicId(getExternalParameterByKey(EXTERNAL_TOPIC_ID));
selectedTopic = new PrivateTopicDecoratedBean(forumManager.getTopicByUuid(getExternalParameterByKey(EXTERNAL_TOPIC_ID)));
selectedTopicTitle = forumManager.getTopicByUuid(getExternalParameterByKey(EXTERNAL_TOPIC_ID)).getTitle();
//"selectedTopicTitle"= "Recibidos"
msgNavMode=getSelectedTopicTitle();
//set prev/next topic details
setPrevNextTopicDetails(msgNavMode);// "Recibidos"
return DISPLAY_MESSAGES_PG;
}
/**
* process Cancel from all JSP's
* @return - pvtMsg
*/
public String processPvtMsgCancel() {
LOG.debug("processPvtMsgCancel()");
// Return to Messages & Forums page or Messages page
if (isMessagesandForums()) {
return MAIN_PG;
}
else {
return MESSAGE_HOME_PG;
}
}
public String processPvtMsgCancelToListView()
{
return DISPLAY_MESSAGES_PG;
}
private String processPvtMsgDraft(){
//set up draft details:
PrivateMessage draft = prtMsgManager.initMessageWithAttachmentsAndRecipients(getDetailMsg().getMsg());
setDetailMsg(new PrivateMessageDecoratedBean(draft));
setComposeSubject(draft.getTitle());
setComposeBody(draft.getBody());
ArrayList attachments = new ArrayList();
for (Attachment attachment : (List<Attachment>) draft.getAttachments()) {
attachments.add(new DecoratedAttachment(attachment));
}
setAttachments(attachments);
setSelectedLabel(draft.getLabel());
//go to compose page
setFromMainOrHp();
fromMain = ("".equals(msgNavMode)) || ("privateMessages".equals(msgNavMode));
LOG.debug("processPvtMsgDraft()");
return PVTMSG_COMPOSE;
}
/**
* called when subject of List of messages to Topic clicked for detail
* @return - pvtMsgDetail
*/
public String processPvtMsgDetail() {
LOG.debug("processPvtMsgDetail()");
multiDeleteSuccess = false;
String msgId=getExternalParameterByKey("current_msg_detail");
setCurrentMsgUuid(msgId) ;
//retrive the detail for this message with currentMessageId
for (Iterator iter = decoratedPvtMsgs.iterator(); iter.hasNext();)
{
PrivateMessageDecoratedBean dMsg= (PrivateMessageDecoratedBean) iter.next();
if (dMsg.getMsg().getId().equals(Long.valueOf(msgId)))
{
this.setDetailMsg(dMsg);
if(dMsg.getMsg().getDraft()){
return processPvtMsgDraft();
}
setDetailMsgCount++;
prtMsgManager.markMessageAsReadForUser(dMsg.getMsg());
PrivateMessage initPrivateMessage = prtMsgManager.initMessageWithAttachmentsAndRecipients(dMsg.getMsg());
this.setDetailMsg(new PrivateMessageDecoratedBean(initPrivateMessage));
setDetailMsgCount++;
List recLs= initPrivateMessage.getRecipients();
for (Iterator iterator = recLs.iterator(); iterator.hasNext();)
{
PrivateMessageRecipient element = (PrivateMessageRecipient) iterator.next();
if (element != null)
{
if((element.getRead().booleanValue()) || (element.getUserId().equals(getUserId())) )
{
getDetailMsg().setHasRead(true) ;
}
}
}
if(dMsg.getMsg().getCreatedBy().equals(getUserId())){
//need to display all users who received the message if the user create the message
this.getDetailMsg().getMsg().setRecipientsAsTextBcc(dMsg.getMsg().getRecipientsAsTextBcc());
}else{
//otherwise, hide the BCC information
this.getDetailMsg().getMsg().setRecipientsAsTextBcc("");
}
this.getDetailMsg().getMsg().setRecipientsAsText(dMsg.getMsg().getRecipientsAsText());
}
}
this.deleteConfirm=false; //reset this as used for multiple action in same JSP
//prev/next message
if(decoratedPvtMsgs != null)
{
for(int i=0; i<decoratedPvtMsgs.size(); i++)
{
PrivateMessageDecoratedBean thisDmb = (PrivateMessageDecoratedBean)decoratedPvtMsgs.get(i);
if(((PrivateMessageDecoratedBean)decoratedPvtMsgs.get(i)).getMsg().getId().toString().equals(msgId))
{
detailMsg.setDepth(thisDmb.getDepth());
detailMsg.setHasNext(thisDmb.getHasNext());
detailMsg.setHasPre(thisDmb.getHasPre());
break;
}
}
}
//default setting for moveTo
moveToTopic=selectedTopicId;
LearningResourceStoreService lrss = (LearningResourceStoreService) ComponentManager
.get("org.sakaiproject.event.api.LearningResourceStoreService");
Event event = EventTrackingService.newEvent("msgcntr", "read private message", true);
lrss.registerStatement(getStatementForUserReadPvtMsg(lrss.getEventActor(event), getDetailMsg().getMsg().getTitle()), "msgcntr");
return SELECTED_MESSAGE_PG;
}
/**
* navigate to "reply" a private message
* @return - pvtMsgReply
*/
public String processPvtMsgReply() {
LOG.debug("processPvtMsgReply()");
setDetailMsgCount = 0;
if (getDetailMsg() == null)
return null;
PrivateMessage pm = getDetailMsg().getMsg();
// To mark as replied when user send the reply
this.setReplyingMessage(pm);
String title = pm.getTitle();
if(title != null && !title.startsWith(getResourceBundleString(REPLY_SUBJECT_PREFIX)))
replyToSubject = getResourceBundleString(REPLY_SUBJECT_PREFIX) + ' ' + title;
else
replyToSubject = title;
// format the created date according to the setting in the bundle
SimpleDateFormat formatter_date = new SimpleDateFormat(getResourceBundleString("date_format_date"), new ResourceLoader().getLocale());
formatter_date.setTimeZone(TimeService.getLocalTimeZone());
String formattedCreateDate = formatter_date.format(pm.getCreated());
SimpleDateFormat formatter_date_time = new SimpleDateFormat(getResourceBundleString("date_format_time"), new ResourceLoader().getLocale());
formatter_date_time.setTimeZone(TimeService.getLocalTimeZone());
String formattedCreateTime = formatter_date_time.format(pm.getCreated());
StringBuilder replyText = new StringBuilder();
// populate replyToBody with the reply text
replyText.append("<br /><br />");
replyText.append("<span style=\"font-weight:bold;font-style:italic;\">");
replyText.append(getResourceBundleString("pvt_msg_on"));
replyText.append(" " + formattedCreateDate + " ");
replyText.append(getResourceBundleString("pvt_msg_at"));
replyText.append(" " +formattedCreateTime);
replyText.append(getResourceBundleString("pvt_msg_comma"));
replyText.append(" " + pm.getAuthor() + " ");
replyText.append(getResourceBundleString("pvt_msg_wrote"));
replyText.append("</span>");
String origBody = pm.getBody();
if (origBody != null && origBody.trim().length() > 0) {
replyText.append("<br />" + pm.getBody() + "<br />");
}
List attachList = getDetailMsg().getAttachList();
if (attachList != null && attachList.size() > 0) {
for (Iterator attachIter = attachList.iterator(); attachIter.hasNext();) {
DecoratedAttachment decoAttach = (DecoratedAttachment) attachIter.next();
if (decoAttach != null) {
replyText.append("<span style=\"font-style:italic;\">");
replyText.append(getResourceBundleString("pvt_msg_["));
replyText.append(decoAttach.getAttachment().getAttachmentName() );
replyText.append(getResourceBundleString("pvt_msg_]") + " ");
replyText.append("</span>");
}
}
}
this.setReplyToBody(replyText.toString());
//from message detail screen
this.setDetailMsg(getDetailMsg()) ;
setDetailMsgCount++;
return MESSAGE_REPLY_PG;
}
/**
* navigate to "forward" a private message
* @return - pvtMsgForward
*/
public String processPvtMsgForward() {
LOG.debug("processPvtMsgForward()");
setDetailMsgCount = 0;
if (getDetailMsg() == null)
return null;
PrivateMessage pm = getDetailMsg().getMsg();
String title = pm.getTitle();
if(title != null && !title.startsWith(getResourceBundleString(FORWARD_SUBJECT_PREFIX)))
forwardSubject = getResourceBundleString(FORWARD_SUBJECT_PREFIX) + ' ' + title;
else
forwardSubject = title;
// format the created date according to the setting in the bundle
SimpleDateFormat formatter = new SimpleDateFormat(getResourceBundleString("date_format"), new ResourceLoader().getLocale());
formatter.setTimeZone(TimeService.getLocalTimeZone());
String formattedCreateDate = formatter.format(pm.getCreated());
StringBuilder forwardedText = new StringBuilder();
// populate replyToBody with the forwarded text
forwardedText.append(getResourceBundleString("pvt_msg_fwd_heading") + "<br /><br />" +
getResourceBundleString("pvt_msg_fwd_authby", new Object[] {pm.getAuthor(), formattedCreateDate}) + "<br />" +
getResourceBundleString("pvt_msg_fwd_to", new Object[] {pm.getRecipientsAsText()}) + "<br />" +
getResourceBundleString("pvt_msg_fwd_subject", new Object[] {pm.getTitle()}) + "<br />" +
getResourceBundleString("pvt_msg_fwd_label", new Object[] {getDetailMsg().getLabel()}) + "<br />");
List attachList = getDetailMsg().getAttachList();
if (attachList != null && attachList.size() > 0) {
forwardedText.append(getResourceBundleString("pvt_msg_fwd_attachments") + "<br />");
forwardedText.append("<ul style=\"list-style-type:none;margin:0;padding:0;padding-left:0.5em;\">");
for (Iterator attachIter = attachList.iterator(); attachIter.hasNext();) {
DecoratedAttachment decoAttach = (DecoratedAttachment) attachIter.next();
if (decoAttach != null) {
forwardedText.append("<li>");
// It seems like there must be a better way to do the attachment image...
String fileType = decoAttach.getAttachment().getAttachmentType();
String imageUrl = null;
if (fileType.equalsIgnoreCase("application/vnd.ms-excel"))
imageUrl = "/messageforums-tool/images/excel.gif";
else if (fileType.equalsIgnoreCase("text/html"))
imageUrl = "/messageforums-tool/images/html.gif";
else if (fileType.equalsIgnoreCase("application/pdf"))
imageUrl = "/messageforums-tool/images/pdf.gif";
else if (fileType.equalsIgnoreCase("application/vnd.ms-powerpoint"))
imageUrl = "/messageforums-tool/images/ppt.gif";
else if (fileType.equalsIgnoreCase("text/plain"))
imageUrl = "/messageforums-tool/images/text.gif";
else if (fileType.equalsIgnoreCase("application/msword"))
imageUrl = "/messageforums-tool/images/word.gif";
if (imageUrl != null) {
forwardedText.append("<img alt=\"\" src=\"" + imageUrl + "\" />");
}
forwardedText.append("<a href=\"" + messageManager.getAttachmentUrl(decoAttach.getAttachment().getAttachmentId()) + "\" target=\"_blank\">" + decoAttach.getAttachment().getAttachmentName() + "</a></li>");
}
}
forwardedText.append("</ul>");
}
String origBody = pm.getBody();
if (origBody != null && origBody.trim().length() > 0) {
forwardedText.append(pm.getBody());
}
this.setForwardBody(forwardedText.toString());
//from message detail screen
this.setDetailMsg(getDetailMsg()) ;
setDetailMsgCount++;
return MESSAGE_FORWARD_PG;
}
//how many letters k in string a a= "fdh,jlg,jds,lgjd" k=","
private int getNum(char letter, String a)
{
int j=0;
for(int i=0; i<a.length(); i++){
if(a.charAt(i)==(letter)){ //s.charAt(j) == 'x'
j++;
}
}
return j;
}
/////////////modified by hu2@iupui.edu begin
//function: add Reply All Tools
/**
* navigate to "Reply to all" a private message
* @return - pvtMsgForward
*/
public String processPvtMsgReplyAll() {
LOG.debug("processPvtMsgReplyAll()");
setDetailMsgCount = 0;
if (getDetailMsg() == null)
return null;
PrivateMessage pm = getDetailMsg().getMsg();
// To mark as replied when user send the reply
this.setReplyingMessage(pm);
String title = pm.getTitle();
if(title != null && !title.startsWith(getResourceBundleString(ReplyAll_SUBJECT_PREFIX)))
forwardSubject = getResourceBundleString(ReplyAll_SUBJECT_PREFIX) + ' ' + title;
else
forwardSubject = title;//forwardSubject
// format the created date according to the setting in the bundle
SimpleDateFormat formatter = new SimpleDateFormat(getResourceBundleString("date_format"), new ResourceLoader().getLocale());
formatter.setTimeZone(TimeService.getLocalTimeZone());
String formattedCreateDate = formatter.format(pm.getCreated());
SimpleDateFormat formatter_date_time = new SimpleDateFormat(getResourceBundleString("date_format_time"), new ResourceLoader().getLocale());
formatter_date_time.setTimeZone(TimeService.getLocalTimeZone());
String formattedCreateTime = formatter_date_time.format(pm.getCreated());
StringBuilder replyallText = new StringBuilder();
// populate replyToBody with the reply text
replyallText.append("<br /><br />");
replyallText.append("<span style=\"font-weight:bold;font-style:italic;\">");
replyallText.append(getResourceBundleString("pvt_msg_on"));
replyallText.append(" " + formattedCreateDate + " ");
replyallText.append(getResourceBundleString("pvt_msg_at"));
replyallText.append(" " +formattedCreateTime);
replyallText.append(getResourceBundleString("pvt_msg_comma"));
replyallText.append(" " + pm.getAuthor() + " ");
replyallText.append(getResourceBundleString("pvt_msg_wrote"));
replyallText.append("</span>");
String origBody = pm.getBody();
if (origBody != null && origBody.trim().length() > 0) {
replyallText.append("<br />" + pm.getBody() + "<br />");
}
List attachList = getDetailMsg().getAttachList();
if (attachList != null && attachList.size() > 0) {
for (Iterator attachIter = attachList.iterator(); attachIter.hasNext();) {
DecoratedAttachment decoAttach = (DecoratedAttachment) attachIter.next();
if (decoAttach != null) {
replyallText.append("<span style=\"font-style:italic;\">");
replyallText.append(getResourceBundleString("pvt_msg_["));
replyallText.append(decoAttach.getAttachment().getAttachmentName() );
replyallText.append(getResourceBundleString("pvt_msg_]") + " ");
replyallText.append("</span>");
}
}
}
this.setForwardBody(replyallText.toString());
String msgautherString=getDetailMsg().getAuthor();
String msgCClistString=getDetailMsg().getRecipientsAsText();
//remove the auther in Cc string
if(msgCClistString.length()>=msgautherString.length())
{
String msgCClistStringwithoutAuthor = msgCClistString;
String currentUserasAuther = getUserName();
char letter=';';
int n=getNum(letter,msgCClistStringwithoutAuthor);
int numberofAuther=0;
if(n==0)
{numberofAuther=1;}
else if(n>=1)
{ numberofAuther=n+1;}//add the end ";"
String[] ccSS = new String[numberofAuther];
ccSS=msgCClistStringwithoutAuthor.split(";");
StringBuffer tmpCC = new StringBuffer("");
if((numberofAuther>0)&&(numberofAuther<=msgCClistStringwithoutAuthor.length()))
{
for(int indexCC =0;indexCC<numberofAuther;indexCC++) //last for ";"
{
if(!currentUserasAuther.replaceAll(" ", ", ").equals(msgautherString)){
if(!ccSS[indexCC].trim().equals(currentUserasAuther.replaceAll(" ", ", "))&&(!ccSS[indexCC].trim().equals(msgautherString)))//not equal current auther and not equal old auther
{
tmpCC.append(ccSS[indexCC].trim()).append("; ");
}
}
else if(currentUserasAuther.replaceAll(" ", ", ").equals(msgautherString)){
if(!ccSS[indexCC].trim().equals(currentUserasAuther.replaceAll(" ", ", "))||(!ccSS[indexCC].trim().equals(msgautherString)))//not equal current auther and not equal old auther
{
tmpCC.append(ccSS[indexCC].trim()).append("; ");
}
}
}
if(tmpCC.length()>1)
{
tmpCC.delete(tmpCC.length()-2, tmpCC.length());//remove the ";"
}
getDetailMsg().setSendToStringDecorated(tmpCC.toString());
getDetailMsg().getMsg().setRecipientsAsText(tmpCC.toString());
}
}
//remove the bcc undiclosed place holder:
String ccList = getDetailMsg().getMsg().getRecipientsAsText();
if(ccList.contains(getResourceBundleString(RECIPIENTS_UNDISCLOSED) + "; ")){
ccList = ccList.replaceAll(getResourceBundleString(RECIPIENTS_UNDISCLOSED) + "; ", "");
}else if(ccList.contains(getResourceBundleString(RECIPIENTS_UNDISCLOSED))){
ccList = ccList.replaceAll(getResourceBundleString(RECIPIENTS_UNDISCLOSED), "");
}
if(ccList.endsWith(" ")){
ccList = ccList.substring(0, ccList.length() -1);
}
if(ccList.endsWith(";")){
ccList = ccList.substring(0, ccList.length() -1);
}
getDetailMsg().getMsg().setRecipientsAsText(ccList);
this.setDetailMsg(getDetailMsg()) ;
setDetailMsgCount++;
return MESSAGE_ReplyAll_PG;//MESSAGE_FORWARD_PG;
}
//////////modified by hu2@iupui.edu end
/**
* called from Single delete Page
* @return - pvtMsgDetail
*/
public String processPvtMsgDeleteConfirm() {
LOG.debug("processPvtMsgDeleteConfirm()");
this.setDeleteConfirm(true);
setErrorMessage(getResourceBundleString(CONFIRM_MSG_DELETE));
/*
* same action is used for delete..however if user presses some other action after first
* delete then 'deleteConfirm' boolean is reset
*/
return SELECTED_MESSAGE_PG ;
}
/**
* called from Single delete Page -
* called when 'delete' button pressed second time
* @return - pvtMsg
*/
public String processPvtMsgDeleteConfirmYes() {
LOG.debug("processPvtMsgDeleteConfirmYes()");
if(getDetailMsg() != null)
{
prtMsgManager.deletePrivateMessage(getDetailMsg().getMsg(), getPrivateMessageTypeFromContext(msgNavMode));
}
return DISPLAY_MESSAGES_PG ;
}
//RESET form variable - required as the bean is in session and some attributes are used as helper for navigation
public void resetFormVariable() {
this.msgNavMode="" ;
this.deleteConfirm=false;
selectAll=false;
attachments.clear();
oldAttachments.clear();
}
/**
* process Compose action from different JSP'S
* @return - pvtMsgCompose
*/
public String processPvtMsgCompose() {
//reset incase draft still has left over data
setDetailMsg(null);
attachments.clear();
oldAttachments.clear();
setFromMainOrHp();
fromMain = ("".equals(msgNavMode)) || ("privateMessages".equals(msgNavMode));
LOG.debug("processPvtMsgCompose()");
return PVTMSG_COMPOSE;
}
public String processPvtMsgComposeCancel()
{
LOG.debug("processPvtMsgComposeCancel()");
resetComposeContents();
if(("privateMessages").equals(getMsgNavMode()))
{
return processPvtMsgReturnToMainOrHp();
}
else
{
return DISPLAY_MESSAGES_PG;
}
}
public void resetComposeContents()
{
this.setComposeBody("");
this.setComposeSubject("");
this.setComposeSendAsPvtMsg(SET_AS_YES); //set as default
this.setBooleanEmailOut(Boolean.parseBoolean(ServerConfigurationService.getString("mc.messages.ccEmailDefault", "false"))); //set as default
this.getSelectedComposeToList().clear();
this.getSelectedComposeBccList().clear();
this.setReplyToSubject("");
this.setReplyToBody("");
this.getAttachments().clear();
this.getAllAttachments().clear();
//reset label
this.setSelectedLabel("pvt_priority_normal");
}
public String processPvtMsgPreview(){
if(!hasValue(getComposeSubject()))
{
setErrorMessage(getResourceBundleString(MISSING_SUBJECT));
return null;
}
if(getSelectedComposeToList().size()<1 && getSelectedComposeBccList().size() < 1)
{
setErrorMessage(getResourceBundleString(SELECT_MSG_RECIPIENT));
return null ;
}
PrivateMessage msg;
if(getDetailMsg() != null && getDetailMsg().getMsg() != null && getDetailMsg().getMsg().getDraft()){
msg = constructMessage(false, getDetailMsg().getMsg());
msg.setDraft(Boolean.TRUE);
}else{
msg = constructMessage(false, null);
}
PrivateMessageDecoratedBean pmDb = new PrivateMessageDecoratedBean(msg);
pmDb.setIsPreview(true);
this.setDetailMsg(pmDb);
return SELECTED_MESSAGE_PG;
}
public String processPvtMsgPreviewSend(){
return processPvtMsgSend();
}
public String processPvtMsgPreviewBack(){
return PVTMSG_COMPOSE;
}
/**
* process from Compose screen
* @return - pvtMsg
*/
//Modified to support internatioalization -by huxt
public String processPvtMsgSend() {
LOG.debug("processPvtMsgSend()");
if(!hasValue(getComposeSubject()))
{
setErrorMessage(getResourceBundleString(MISSING_SUBJECT));
return null;
}
if(getSelectedComposeToList().size()<1)
{
setErrorMessage(getResourceBundleString(SELECT_MSG_RECIPIENT));
return null ;
}
PrivateMessage pMsg = null;
if(getDetailMsg() != null && getDetailMsg().getMsg() != null && getDetailMsg().getMsg().getDraft()){
pMsg = constructMessage(true, getDetailMsg().getMsg());
}else{
pMsg= constructMessage(true, null) ;
}
Map<User, Boolean> recipients = getRecipients();
prtMsgManager.sendPrivateMessage(pMsg, recipients, isSendEmail());
// if you are sending a reply
Message replying = pMsg.getInReplyTo();
if (replying!=null) {
replying = prtMsgManager.getMessageById(replying.getId());
if (replying!=null) {
prtMsgManager.markMessageAsRepliedForUser((PrivateMessage)replying);
}
}
//update synopticLite tool information:
incrementSynopticToolInfo(recipients.keySet(), false);
//reset contents
resetComposeContents();
LearningResourceStoreService lrss = (LearningResourceStoreService) ComponentManager
.get("org.sakaiproject.event.api.LearningResourceStoreService");
Event event = EventTrackingService.newEvent(DiscussionForumService.EVENT_MESSAGES_ADD, getEventMessage(pMsg), false);
EventTrackingService.post(event);
lrss.registerStatement(getStatementForUserSentPvtMsg(lrss.getEventActor(event), pMsg.getTitle(), SAKAI_VERB.shared), "msgcntr");
if(fromMainOrHp != null && !"".equals(fromMainOrHp))
{
String tmpBackPage = fromMainOrHp;
fromMainOrHp = "";
return tmpBackPage;
}
else if(selectedTopic != null)
{
msgNavMode=getSelectedTopicTitle();
setPrevNextTopicDetails(msgNavMode);
return DISPLAY_MESSAGES_PG;
}
// Return to Messages & Forums page or Messages page
if (isMessagesandForums()) {
return MAIN_PG;
}
else {
return MESSAGE_HOME_PG;
}
}
public void incrementSynopticToolInfo(Set<User> recipients, boolean updateCurrentUser){
String siteId = getSiteId();
String currentUser = getUserId();
for (User user : recipients) {
if(updateCurrentUser || (!updateCurrentUser && !currentUser.equals(user.getId())))
incrementMessagesSynopticToolInfo(user.getId(), siteId, SynopticMsgcntrManager.NUM_OF_ATTEMPTS);
}
}
public void incrementMessagesSynopticToolInfo(String userId, String siteId, int numOfAttempts) {
try {
getSynopticMsgcntrManager().incrementMessagesSynopticToolInfo(userId, siteId);
} catch (HibernateOptimisticLockingFailureException holfe) {
// failed, so wait and try again
try {
Thread.sleep(SynopticMsgcntrManager.OPT_LOCK_WAIT);
} catch (InterruptedException e) {
e.printStackTrace();
}
numOfAttempts--;
if (numOfAttempts <= 0) {
System.out
.println("PrivateMessagesTool: incrementMessagesSynopticToolInfo: HibernateOptimisticLockingFailureException no more retries left");
holfe.printStackTrace();
} else {
System.out
.println("PrivateMessagesTool: incrementMessagesSynopticToolInfo: HibernateOptimisticLockingFailureException: attempts left: "
+ numOfAttempts);
incrementMessagesSynopticToolInfo(userId, siteId, numOfAttempts);
}
}
}
/**
* process from Compose screen
* @return - pvtMsg
*/
public String processPvtMsgSaveDraft() {
LOG.debug("processPvtMsgSaveDraft()");
if(!hasValue(getComposeSubject()))
{
setErrorMessage(getResourceBundleString(MISSING_SUBJECT_DRAFT));
return null ;
}
// if(!hasValue(getComposeBody()) )
// {
// setErrorMessage("Please enter message body for this compose message.");
// return null ;
// }
// if(getSelectedComposeToList().size()<1)
// {
// setErrorMessage(getResourceBundleString(SELECT_MSG_RECIPIENT));
// return null ;
// }
PrivateMessage dMsg = null;
if(getDetailMsg() != null && getDetailMsg().getMsg() != null && getDetailMsg().getMsg().getDraft()){
dMsg =constructMessage(true, getDetailMsg().getMsg()) ;
}else{
dMsg =constructMessage(true, null) ;
}
dMsg.setDraft(Boolean.TRUE);
dMsg.setDeleted(Boolean.FALSE);
prtMsgManager.sendPrivateMessage(dMsg, getRecipients(), isSendEmail());
//reset contents
resetComposeContents();
return returnDraftPage();
}
private String returnDraftPage(){
return processPvtMsgComposeCancel();
}
// created separate method as to be used with processPvtMsgSend() and processPvtMsgSaveDraft()
public PrivateMessage constructMessage(boolean clearAttachments, PrivateMessage aMsg)
{
if(aMsg == null){
aMsg = messageManager.createPrivateMessage();
}else{
//set the date for now:
aMsg.setCreated(new Date());
}
if (aMsg != null)
{
StringBuilder alertMsg = new StringBuilder();
aMsg.setTitle(FormattedText.processFormattedText(getComposeSubject(), alertMsg));
aMsg.setBody(FormattedText.processFormattedText(getComposeBody(), alertMsg));
aMsg.setAuthor(getAuthorString());
aMsg.setDraft(Boolean.FALSE);
aMsg.setApproved(Boolean.FALSE);
aMsg.setLabel(getSelectedLabel());
// this property added so can delete forum messages
// since that and PM share same message object and
// delete is not null....
aMsg.setDeleted(Boolean.FALSE);
// Add the recipientList as String for display in Sent folder
// Any hidden users will be tacked on at the end
StringBuffer sendToString = new StringBuffer("");
StringBuffer sendToHiddenString = new StringBuffer("");
if (selectedComposeToList.size() == 1) {
MembershipItem membershipItem = (MembershipItem) courseMemberMap.get(selectedComposeToList.get(0));
if (membershipItem != null) {
sendToString.append(membershipItem.getName()).append("; ");
}
}
else {
for (int i = 0; i < selectedComposeToList.size(); i++)
{
MembershipItem membershipItem = (MembershipItem) courseMemberMap.get(selectedComposeToList.get(i));
if(membershipItem != null)
{
if (membershipItem.isViewable()) {
sendToString.append(membershipItem.getName()).append("; ");
}
else {
sendToHiddenString.append(membershipItem.getName()).append("; ");
}
}
}
}
//add bcc recipients place holder:
if(selectedComposeBccList.size() > 0 && !sendToString.toString().contains(getResourceBundleString(RECIPIENTS_UNDISCLOSED))){
sendToString.append(getResourceBundleString(RECIPIENTS_UNDISCLOSED)).append("; ");
}
//create bcc string to use to display the user's who got BCC'ed
StringBuffer sendToBccString = new StringBuffer("");
StringBuffer sendToBccHiddenString = new StringBuffer("");
for (int i = 0; i < selectedComposeBccList.size(); i++)
{
MembershipItem membershipItem = (MembershipItem) courseMemberMap.get(selectedComposeBccList.get(i));
if(membershipItem != null)
{
if (membershipItem.isViewable()) {
sendToBccString.append(membershipItem.getName()).append("; ");
}
else {
sendToBccHiddenString.append(membershipItem.getName()).append("; ");
}
}
}
if (! "".equals(sendToString.toString())) {
sendToString.delete(sendToString.length()-2, sendToString.length()); //remove last comma and space
}
if ("".equals(sendToHiddenString.toString())) {
aMsg.setRecipientsAsText(sendToString.toString());
}
else {
sendToHiddenString.delete(sendToHiddenString.length()-2, sendToHiddenString.length()); //remove last comma and space
aMsg.setRecipientsAsText(sendToString.toString() + " " + PrivateMessage.HIDDEN_RECIPIENTS_START + sendToHiddenString.toString() + PrivateMessage.HIDDEN_RECIPIENTS_END);
}
//clean up sendToBccString
if (! "".equals(sendToBccString.toString())) {
sendToBccString.delete(sendToBccString.length()-2, sendToBccString.length()); //remove last comma and space
}
if ("".equals(sendToBccHiddenString.toString())) {
aMsg.setRecipientsAsTextBcc(sendToBccString.toString());
}
else {
sendToBccHiddenString.delete(sendToBccHiddenString.length()-2, sendToBccHiddenString.length()); //remove last comma and space
aMsg.setRecipientsAsTextBcc(sendToBccString.toString() + " " + PrivateMessage.HIDDEN_RECIPIENTS_START + sendToBccHiddenString.toString() + PrivateMessage.HIDDEN_RECIPIENTS_END);
}
}
//Add attachments
for(int i=0; i<attachments.size(); i++)
{
prtMsgManager.addAttachToPvtMsg(aMsg, ((DecoratedAttachment)attachments.get(i)).getAttachment());
}
if(clearAttachments){
//clear
attachments.clear();
oldAttachments.clear();
}
return aMsg;
}
///////////////////// Previous/Next topic and message on Detail message page
/**
* Set Previous and Next message details with each PrivateMessageDecoratedBean
*/
public void setPrevNextMessageDetails()
{
List tempMsgs = decoratedPvtMsgs;
for(int i=0; i<tempMsgs.size(); i++)
{
PrivateMessageDecoratedBean dmb = (PrivateMessageDecoratedBean)tempMsgs.get(i);
if(i==0)
{
dmb.setHasPre(false);
if(i==(tempMsgs.size()-1))
{
dmb.setHasNext(false);
}
else
{
dmb.setHasNext(true);
}
}
else if(i==(tempMsgs.size()-1))
{
dmb.setHasPre(true);
dmb.setHasNext(false);
}
else
{
dmb.setHasNext(true);
dmb.setHasPre(true);
}
}
}
/**
* processDisplayPreviousMsg()
* Display the previous message from the list of decorated messages
*/
public String processDisplayPreviousMsg()
{
List tempMsgs = getDecoratedPvtMsgs(); // all messages
int currentMsgPosition = -1;
if(tempMsgs != null)
{
for(int i=0; i<tempMsgs.size(); i++)
{
PrivateMessageDecoratedBean thisDmb = (PrivateMessageDecoratedBean)tempMsgs.get(i);
if(detailMsg.getMsg().getId().equals(thisDmb.getMsg().getId()))
{
currentMsgPosition = i;
break;
}
}
}
if(currentMsgPosition > 0)
{
PrivateMessageDecoratedBean thisDmb = (PrivateMessageDecoratedBean)tempMsgs.get(currentMsgPosition-1);
PrivateMessage message= (PrivateMessage) prtMsgManager.getMessageById(thisDmb.getMsg().getId());
detailMsg= new PrivateMessageDecoratedBean(message);
//get attachments
prtMsgManager.markMessageAsReadForUser(detailMsg.getMsg());
PrivateMessage initPrivateMessage = prtMsgManager.initMessageWithAttachmentsAndRecipients(detailMsg.getMsg());
this.setDetailMsg(new PrivateMessageDecoratedBean(initPrivateMessage));
setDetailMsgCount++;
List recLs= initPrivateMessage.getRecipients();
for (Iterator iterator = recLs.iterator(); iterator.hasNext();)
{
PrivateMessageRecipient element = (PrivateMessageRecipient) iterator.next();
if (element != null)
{
if((element.getRead().booleanValue()) || (element.getUserId().equals(getUserId())) )
{
getDetailMsg().setHasRead(true) ;
}
}
}
getDetailMsg().setDepth(thisDmb.getDepth()) ;
getDetailMsg().setHasNext(thisDmb.getHasNext());
getDetailMsg().setHasPre(thisDmb.getHasPre()) ;
}
LearningResourceStoreService lrss = (LearningResourceStoreService) ComponentManager
.get("org.sakaiproject.event.api.LearningResourceStoreService");
Event event = EventTrackingService.newEvent("msgcntr", "read private message", true);
lrss.registerStatement(getStatementForUserReadPvtMsg(lrss.getEventActor(event), getDetailMsg().getMsg().getTitle()), "msgcntr");
return null;
}
/**
* processDisplayNextMsg()
* Display the Next message from the list of decorated messages
*/
public String processDisplayNextMsg()
{
List tempMsgs = getDecoratedPvtMsgs();
int currentMsgPosition = -1;
if(tempMsgs != null)
{
for(int i=0; i<tempMsgs.size(); i++)
{
PrivateMessageDecoratedBean thisDmb = (PrivateMessageDecoratedBean)tempMsgs.get(i);
if(detailMsg.getMsg().getId().equals(thisDmb.getMsg().getId()))
{
currentMsgPosition = i;
break;
}
}
}
if(currentMsgPosition > -2 && currentMsgPosition < (tempMsgs.size()-1))
{
PrivateMessageDecoratedBean thisDmb = (PrivateMessageDecoratedBean)tempMsgs.get(currentMsgPosition+1);
//get attachments
prtMsgManager.markMessageAsReadForUser(thisDmb.getMsg());
PrivateMessage initPrivateMessage = prtMsgManager.initMessageWithAttachmentsAndRecipients(thisDmb.getMsg());
this.setDetailMsg(new PrivateMessageDecoratedBean(initPrivateMessage));
setDetailMsgCount++;
List recLs= initPrivateMessage.getRecipients();
for (Iterator iterator = recLs.iterator(); iterator.hasNext();)
{
PrivateMessageRecipient element = (PrivateMessageRecipient) iterator.next();
if (element != null)
{
if((element.getRead().booleanValue()) || (element.getUserId().equals(getUserId())) )
{
getDetailMsg().setHasRead(true) ;
}
}
}
getDetailMsg().setDepth(thisDmb.getDepth()) ;
getDetailMsg().setHasNext(thisDmb.getHasNext());
getDetailMsg().setHasPre(thisDmb.getHasPre()) ;
}
LearningResourceStoreService lrss = (LearningResourceStoreService) ComponentManager
.get("org.sakaiproject.event.api.LearningResourceStoreService");
Event event = EventTrackingService.newEvent("msgcntr", "read private message", true);
lrss.registerStatement(getStatementForUserReadPvtMsg(lrss.getEventActor(event), getDetailMsg().getMsg().getTitle()), "msgcntr");
return null;
}
///////////////////////////////////// DISPLAY NEXT/PREVIOUS TOPIC //////////////////////////////////
private PrivateTopicDecoratedBean selectedTopic;
/**
* @return Returns the selectedTopic.
*/
public PrivateTopicDecoratedBean getSelectedTopic()
{
return selectedTopic;
}
/**
* @param selectedTopic The selectedTopic to set.
*/
public void setSelectedTopic(PrivateTopicDecoratedBean selectedTopic)
{
this.selectedTopic = selectedTopic;
}
/**
* Add prev and next topic UUID value and booleans for display of links
*
*/
public void setPrevNextTopicDetails(String msgNavMode)
{
for (int i = 0; i < pvtTopics.size(); i++)
{
Topic el = (Topic)pvtTopics.get(i);
if(el.getTitle().equals(msgNavMode))
{
setSelectedTopic(new PrivateTopicDecoratedBean(el)) ;
if(i ==0)
{
getSelectedTopic().setHasPreviousTopic(false);
if(i==(pvtTopics.size()-1))
{
getSelectedTopic().setHasNextTopic(false) ;
}
else
{
getSelectedTopic().setHasNextTopic(true) ;
Topic nt=(Topic)pvtTopics.get(i+1);
if (nt != null)
{
//getSelectedTopic().setNextTopicId(nt.getUuid());
getSelectedTopic().setNextTopicTitle(nt.getTitle());
}
}
}
else if(i==(pvtTopics.size()-1))
{
getSelectedTopic().setHasPreviousTopic(true);
getSelectedTopic().setHasNextTopic(false) ;
Topic pt=(Topic)pvtTopics.get(i-1);
if (pt != null)
{
//getSelectedTopic().setPreviousTopicId(pt.getUuid());
getSelectedTopic().setPreviousTopicTitle(pt.getTitle());
}
}
else
{
getSelectedTopic().setHasNextTopic(true) ;
getSelectedTopic().setHasPreviousTopic(true);
Topic nt=(Topic)pvtTopics.get(i+1);
if (nt != null)
{
//getSelectedTopic().setNextTopicId(nt.getUuid());
getSelectedTopic().setNextTopicTitle(nt.getTitle());
}
Topic pt=(Topic)pvtTopics.get(i-1);
if (pt != null)
{
//getSelectedTopic().setPreviousTopicId(pt.getUuid());
getSelectedTopic().setPreviousTopicTitle(pt.getTitle());
}
}
}
}
//create a selected topic and set the topic id for next/prev topic
}
/**
* processDisplayPreviousFolder()
*/
public String processDisplayPreviousTopic() {
multiDeleteSuccess = false;
String prevTopicTitle = getExternalParameterByKey("previousTopicTitle");
if(hasValue(prevTopicTitle))
{
msgNavMode=prevTopicTitle;
decoratedPvtMsgs=new ArrayList() ;
String typeUuid = getPrivateMessageTypeFromContext(msgNavMode);
decoratedPvtMsgs= prtMsgManager.getMessagesByType(typeUuid, PrivateMessageManager.SORT_COLUMN_DATE,
PrivateMessageManager.SORT_DESC);
decoratedPvtMsgs = createDecoratedDisplay(decoratedPvtMsgs);
if(selectView!=null && selectView.equalsIgnoreCase(THREADED_VIEW))
{
this.rearrageTopicMsgsThreaded(false);
}
//set prev/next Topic
setPrevNextTopicDetails(msgNavMode);
//set prev/next message
setPrevNextMessageDetails();
if (searchPvtMsgs != null)
{
searchPvtMsgs.clear();
return DISPLAY_MESSAGES_PG;
}
}
return null;
}
/**
* processDisplayNextFolder()
*/
public String processDisplayNextTopic()
{
multiDeleteSuccess = false;
String nextTitle = getExternalParameterByKey("nextTopicTitle");
if(hasValue(nextTitle))
{
msgNavMode=nextTitle;
decoratedPvtMsgs=new ArrayList() ;
String typeUuid = getPrivateMessageTypeFromContext(msgNavMode);
decoratedPvtMsgs= prtMsgManager.getMessagesByType(typeUuid, PrivateMessageManager.SORT_COLUMN_DATE,
PrivateMessageManager.SORT_DESC);
decoratedPvtMsgs = createDecoratedDisplay(decoratedPvtMsgs);
if(selectView!=null && selectView.equalsIgnoreCase(THREADED_VIEW))
{
this.rearrageTopicMsgsThreaded(false);
}
//set prev/next Topic
setPrevNextTopicDetails(msgNavMode);
//set prev/next message
setPrevNextMessageDetails();
if (searchPvtMsgs != null)
{
searchPvtMsgs.clear();
return DISPLAY_MESSAGES_PG;
}
}
return null;
}
///////////////////////////////////// DISPLAY NEXT/PREVIOUS TOPIC //////////////////////////////////
//////////////////////////////////////////////////////////
/**
* @param externalTopicId
* @return
*/
private String processDisplayMsgById(String externalMsgId)
{
LOG.debug("processDisplayMsgById()");
String msgId=getExternalParameterByKey(externalMsgId);
if(msgId!=null)
{
PrivateMessageDecoratedBean dbean=null;
PrivateMessage msg = (PrivateMessage) prtMsgManager.getMessageById(Long.valueOf(msgId)) ;
if(msg != null)
{
if (dbean == null)
throw new IllegalStateException(
"PrivateMessageDecoratedBean dbean == null!");
dbean.addPvtMessage(new PrivateMessageDecoratedBean(msg)) ;
detailMsg = dbean;
}
}
else
{
LOG.debug("processDisplayMsgById() - Error");
return DISPLAY_MESSAGES_PG;
}
return SELECTED_MESSAGE_PG;
}
//////////////////////REPLY SEND /////////////////
public String processPvtMsgPreviewReply(){
PrivateMessage pvtMsg = getPvtMsgReplyMessage(getDetailMsg().getMsg(), false);
if(pvtMsg == null){
return null;
}else{
PrivateMessageDecoratedBean pmDb = new PrivateMessageDecoratedBean(pvtMsg);
pmDb.setIsPreviewReply(true);
pmDb.setPreviewReplyTmpMsg(getDetailMsg());
this.setDetailMsg(pmDb);
return SELECTED_MESSAGE_PG;
}
}
public String processPvtMsgPreviewReplyBack(){
this.setDetailMsg(getDetailMsg().getPreviewReplyTmpMsg());
return MESSAGE_REPLY_PG;
}
public String processPvtMsgPreviewReplySend(){
return processPvtMsgReplySentAction(getDetailMsg().getMsg());
}
public String processPvtMsgReplySend() {
LOG.debug("processPvtMsgReplySend()");
return processPvtMsgReplySentAction(getPvtMsgReplyMessage(getDetailMsg().getMsg(), false));
}
private String processPvtMsgReplySentAction(PrivateMessage rrepMsg){
if(rrepMsg == null){
return null;
}else{
Map<User, Boolean> recipients = getRecipients();
prtMsgManager.sendPrivateMessage(rrepMsg, recipients, isSendEmail());
if(!rrepMsg.getDraft()){
prtMsgManager.markMessageAsRepliedForUser(getReplyingMessage());
incrementSynopticToolInfo(recipients.keySet(), false);
LearningResourceStoreService lrss = (LearningResourceStoreService) ComponentManager
.get("org.sakaiproject.event.api.LearningResourceStoreService");
Event event = EventTrackingService.newEvent(DiscussionForumService.EVENT_MESSAGES_RESPONSE, getEventMessage(rrepMsg), false);
EventTrackingService.post(event);
lrss.registerStatement(getStatementForUserSentPvtMsg(lrss.getEventActor(event), getDetailMsg().getMsg().getTitle(), SAKAI_VERB.responded), "msgcntr");
}
//reset contents
resetComposeContents();
return DISPLAY_MESSAGES_PG;
}
}
private PrivateMessage getPvtMsgReplyMessage(PrivateMessage currentMessage, boolean isDraft){
if (setDetailMsgCount != 1) {
setErrorMessage(getResourceBundleString(MULTIPLE_WINDOWS , new Object[] {ServerConfigurationService.getString("ui.service","Sakai")}));
return null;
} else {
//PrivateMessage currentMessage = getDetailMsg().getMsg() ;
//by default add user who sent original message
for (Iterator i = totalComposeToList.iterator(); i.hasNext();) {
MembershipItem membershipItem = (MembershipItem) i.next();
if (MembershipItem.TYPE_USER.equals(membershipItem.getType())) {
if (membershipItem.getUser() != null) {
if (membershipItem.getUser().getId().equals(currentMessage.getCreatedBy())) {
selectedComposeToList.add(membershipItem.getId());
}
}
}
}
if(!hasValue(getReplyToSubject()))
{
if(isDraft){
setErrorMessage(getResourceBundleString(MISSING_SUBJECT_DRAFT));
}else{
setErrorMessage(getResourceBundleString(MISSING_SUBJECT));
}
return null ;
}
if(!isDraft){
if(selectedComposeToList.size()<1 && selectedComposeBccList.size() < 1)
{
setErrorMessage(getResourceBundleString(SELECT_RECIPIENT_LIST_FOR_REPLY));
return null ;
}
}
PrivateMessage rrepMsg = messageManager.createPrivateMessage() ;
StringBuilder alertMsg = new StringBuilder();
rrepMsg.setTitle(FormattedText.processFormattedText(getReplyToSubject(), alertMsg));
rrepMsg.setBody(FormattedText.processFormattedText(getReplyToBody(), alertMsg));
rrepMsg.setDraft(Boolean.FALSE);
rrepMsg.setDeleted(Boolean.FALSE);
rrepMsg.setAuthor(getAuthorString());
rrepMsg.setApproved(Boolean.FALSE);
rrepMsg.setLabel(getSelectedLabel());
rrepMsg.setInReplyTo(currentMessage) ;
//Add the recipientList as String for display in Sent folder
// Since some users may be hidden, if some of these are recipients
// filter them out (already checked if no recipients)
// if only 1 recipient no need to check visibility
StringBuffer sendToString = new StringBuffer("");
StringBuffer sendToHiddenString = new StringBuffer("");
if (selectedComposeToList.size() == 1) {
MembershipItem membershipItem = (MembershipItem) courseMemberMap.get(selectedComposeToList.get(0));
if(membershipItem != null)
{
sendToString.append(membershipItem.getName()).append("; ");
}
}
else {
for (int i = 0; i < selectedComposeToList.size(); i++)
{
MembershipItem membershipItem = (MembershipItem) courseMemberMap.get(selectedComposeToList.get(i));
if(membershipItem != null)
{
if (membershipItem.isViewable()) {
sendToString.append(membershipItem.getName()).append("; ");
}
else {
sendToHiddenString.append(membershipItem.getName()).append("; ");
}
}
}
}
//add bcc recipients place holder:
if(selectedComposeBccList.size() > 0 && !sendToString.toString().contains(getResourceBundleString(RECIPIENTS_UNDISCLOSED))){
sendToString.append(getResourceBundleString(RECIPIENTS_UNDISCLOSED)).append("; ");
}
//create sendToBccString
StringBuffer sendToBccString = new StringBuffer("");
StringBuffer sendToBccHiddenString = new StringBuffer("");
for (int i = 0; i < selectedComposeBccList.size(); i++)
{
MembershipItem membershipItem = (MembershipItem) courseMemberMap.get(selectedComposeBccList.get(i));
if(membershipItem != null)
{
if (membershipItem.isViewable()) {
sendToBccString.append(membershipItem.getName()).append("; ");
}
else {
sendToBccHiddenString.append(membershipItem.getName()).append("; ");
}
}
}
//clean sendToString
if (! "".equals(sendToString.toString())) {
sendToString.delete(sendToString.length()-2, sendToString.length()); //remove last comma and space
}
if ("".equals(sendToHiddenString.toString())) {
rrepMsg.setRecipientsAsText(sendToString.toString());
}
else {
sendToHiddenString.delete(sendToHiddenString.length()-2, sendToHiddenString.length()); //remove last comma and space
rrepMsg.setRecipientsAsText(sendToString.toString() + " " + PrivateMessage.HIDDEN_RECIPIENTS_START + sendToHiddenString.toString() + PrivateMessage.HIDDEN_RECIPIENTS_END);
}
//clean sendToBccString
//clean sendToString
if (! "".equals(sendToBccString.toString())) {
sendToBccString.delete(sendToBccString.length()-2, sendToBccString.length()); //remove last comma and space
}
if ("".equals(sendToBccHiddenString.toString())) {
rrepMsg.setRecipientsAsTextBcc(sendToBccString.toString());
}
else {
sendToBccHiddenString.delete(sendToBccHiddenString.length()-2, sendToBccHiddenString.length()); //remove last comma and space
rrepMsg.setRecipientsAsTextBcc(sendToBccString.toString() + " " + PrivateMessage.HIDDEN_RECIPIENTS_START + sendToBccHiddenString.toString() + PrivateMessage.HIDDEN_RECIPIENTS_END);
}
//Add attachments
for(int i=0; i<allAttachments.size(); i++)
{
prtMsgManager.addAttachToPvtMsg(rrepMsg, ((DecoratedAttachment)allAttachments.get(i)).getAttachment());
}
return rrepMsg;
}
}
// ////////////////////Forward SEND /////////////////
public String processPvtMsgPreviewForward(){
PrivateMessage pvtMsg = getPvtMsgForward(getDetailMsg().getMsg(), false);
if(pvtMsg == null){
return null;
}else{
PrivateMessageDecoratedBean pmDb = new PrivateMessageDecoratedBean(pvtMsg);
pmDb.setIsPreviewForward(true);
pmDb.setPreviewReplyTmpMsg(getDetailMsg());
this.setDetailMsg(pmDb);
return SELECTED_MESSAGE_PG;
}
}
public String processPvtMsgPreviewForwardBack(){
String title = getDetailMsg().getMsg().getTitle();
String body = getDetailMsg().getMsg().getBody();
this.setDetailMsg(getDetailMsg().getPreviewReplyTmpMsg());
String returnString = processPvtMsgForward();
//reset title and body:
getDetailMsg().getMsg().setTitle(title);
setForwardSubject(title);
getDetailMsg().getMsg().setBody(body);
setForwardBody(body);
return returnString;
}
public String processPvtMsgPreviewForwardSend(){
processPvtMsgForwardSendHelper(getDetailMsg().getMsg());
return DISPLAY_MESSAGES_PG;
}
public String processPvtMsgForwardSend() {
LOG.debug("processPvtMsgForwardSend()");
if (setDetailMsgCount != 1) {
setErrorMessage(getResourceBundleString(MULTIPLE_WINDOWS , new Object[] {ServerConfigurationService.getString("ui.service","Sakai")}));
return null;
} else {
PrivateMessage pvtMsg = getPvtMsgForward(getDetailMsg().getMsg(), false);
if(pvtMsg == null){
return null;
}else{
processPvtMsgForwardSendHelper(pvtMsg);
return DISPLAY_MESSAGES_PG;
}
}
}
public String processPvtMsgForwardSaveDraft(){
LOG.debug("processPvtMsgForwardSaveDraft()");
if (setDetailMsgCount != 1) {
setErrorMessage(getResourceBundleString(MULTIPLE_WINDOWS , new Object[] {ServerConfigurationService.getString("ui.service","Sakai")}));
return null;
} else {
PrivateMessage pvtMsg = getPvtMsgForward(getDetailMsg().getMsg(), true);
if(pvtMsg == null){
return null;
}else{
pvtMsg.setDraft(Boolean.TRUE);
processPvtMsgForwardSendHelper(pvtMsg);
return returnDraftPage();
}
}
}
private PrivateMessage getPvtMsgForward(PrivateMessage currentMessage, boolean isDraft){
if(!isDraft){
if(getSelectedComposeToList().size()<1 && getSelectedComposeBccList().size() < 1)
{
setErrorMessage(getResourceBundleString(SELECT_MSG_RECIPIENT));
return null ;
}
}
if(!hasValue(getForwardSubject()))
{
if(isDraft){
setErrorMessage(getResourceBundleString(MISSING_SUBJECT_DRAFT));
}else{
setErrorMessage(getResourceBundleString(MISSING_SUBJECT));
}
return null ;
}
PrivateMessage rrepMsg = messageManager.createPrivateMessage() ;
StringBuilder alertMsg = new StringBuilder();
rrepMsg.setTitle(FormattedText.processFormattedText(getForwardSubject(), alertMsg));
rrepMsg.setDraft(Boolean.FALSE);
rrepMsg.setDeleted(Boolean.FALSE);
rrepMsg.setAuthor(getAuthorString());
rrepMsg.setApproved(Boolean.FALSE);
rrepMsg.setBody(FormattedText.processFormattedText(getForwardBody(), alertMsg));
rrepMsg.setLabel(getSelectedLabel());
rrepMsg.setInReplyTo(currentMessage) ;
//Add the recipientList as String for display in Sent folder
// Since some users may be hidden, if some of these are recipients
// filter them out (already checked if no recipients)
// if only 1 recipient no need to check visibility
StringBuffer sendToString = new StringBuffer();
StringBuffer sendToHiddenString = new StringBuffer();
if (selectedComposeToList.size() == 1) {
MembershipItem membershipItem = (MembershipItem) courseMemberMap.get(selectedComposeToList.get(0));
if(membershipItem != null)
{
sendToString.append(membershipItem.getName()).append("; ");
}
}
else {
for (int i = 0; i < selectedComposeToList.size(); i++)
{
MembershipItem membershipItem = (MembershipItem) courseMemberMap.get(selectedComposeToList.get(i));
if(membershipItem != null)
{
if (membershipItem.isViewable()) {
sendToString.append(membershipItem.getName()).append("; ");
}
else {
sendToHiddenString.append(membershipItem.getName()).append("; ");
}
}
}
}
//add bcc recipients place holder:
if(selectedComposeBccList.size() > 0 && !sendToString.toString().contains(getResourceBundleString(RECIPIENTS_UNDISCLOSED))){
sendToString.append(getResourceBundleString(RECIPIENTS_UNDISCLOSED)).append("; ");
}
StringBuffer sendToBccString = new StringBuffer();
StringBuffer sendToBccHiddenString = new StringBuffer();
for (int i = 0; i < selectedComposeBccList.size(); i++)
{
MembershipItem membershipItem = (MembershipItem) courseMemberMap.get(selectedComposeBccList.get(i));
if(membershipItem != null)
{
if (membershipItem.isViewable()) {
sendToBccString.append(membershipItem.getName()).append("; ");
}
else {
sendToBccHiddenString.append(membershipItem.getName()).append("; ");
}
}
}
//clean sendToString
if (! "".equals(sendToString.toString())) {
sendToString.delete(sendToString.length()-2, sendToString.length()); //remove last comma and space
}
if ("".equals(sendToHiddenString.toString())) {
rrepMsg.setRecipientsAsText(sendToString.toString());
}
else {
sendToHiddenString.delete(sendToHiddenString.length()-2, sendToHiddenString.length()); //remove last comma and space
rrepMsg.setRecipientsAsText(sendToString.toString() + " (" + sendToHiddenString.toString() + ")");
}
//clean sendToBccString
if (! "".equals(sendToBccString.toString())) {
sendToBccString.delete(sendToBccString.length()-2, sendToBccString.length()); //remove last comma and space
}
if ("".equals(sendToBccHiddenString.toString())) {
rrepMsg.setRecipientsAsTextBcc(sendToBccString.toString());
}
else {
sendToBccHiddenString.delete(sendToBccHiddenString.length()-2, sendToBccHiddenString.length()); //remove last comma and space
rrepMsg.setRecipientsAsTextBcc(sendToBccString.toString() + " (" + sendToBccHiddenString.toString() + ")");
}
//Add attachments
for(int i=0; i<allAttachments.size(); i++)
{
prtMsgManager.addAttachToPvtMsg(rrepMsg, ((DecoratedAttachment)allAttachments.get(i)).getAttachment());
}
return rrepMsg;
}
private void processPvtMsgForwardSendHelper(PrivateMessage rrepMsg){
Map<User, Boolean> recipients = getRecipients();
prtMsgManager.sendPrivateMessage(rrepMsg, recipients, isSendEmail());
if(!rrepMsg.getDraft()){
//update Synoptic tool info
incrementSynopticToolInfo(recipients.keySet(), false);
LearningResourceStoreService lrss = (LearningResourceStoreService) ComponentManager
.get("org.sakaiproject.event.api.LearningResourceStoreService");
Event event = EventTrackingService.newEvent(DiscussionForumService.EVENT_MESSAGES_FORWARD, getEventMessage(rrepMsg), false);
EventTrackingService.post(event);
lrss.registerStatement(getStatementForUserSentPvtMsg(lrss.getEventActor(event), getDetailMsg().getMsg().getTitle(), SAKAI_VERB.responded), "msgcntr");
}
//reset contents
resetComposeContents();
}
//reply all preview:
public String processPvtMsgPreviewReplyAll(){
PrivateMessage pvtMsg = processPvtMsgReplyAllSendHelper(true, Boolean.FALSE);
if(pvtMsg == null){
return null;
}else{
PrivateMessageDecoratedBean pmDb = new PrivateMessageDecoratedBean(pvtMsg);
pmDb.setIsPreviewReplyAll(true);
pmDb.setPreviewReplyTmpMsg(getDetailMsg());
this.setDetailMsg(pmDb);
return SELECTED_MESSAGE_PG;
}
}
public String processPvtMsgPreviewReplyAllBack(){
this.setDetailMsg(getDetailMsg().getPreviewReplyTmpMsg());
return MESSAGE_ReplyAll_PG;
}
public String processPvtMsgPreviewReplyAllSend(){
this.setDetailMsg(getDetailMsg().getPreviewReplyTmpMsg());
PrivateMessage pvtMsg = processPvtMsgReplyAllSendHelper(false, Boolean.FALSE);
if(pvtMsg == null){
return null;
}else{
return DISPLAY_MESSAGES_PG;
}
}
public String processPvtMsgReplyAllSaveDraft(){
LOG.debug("processPvtMsgReply All Send()");
if (setDetailMsgCount != 1) {
setErrorMessage(getResourceBundleString(MULTIPLE_WINDOWS , new Object[] {ServerConfigurationService.getString("ui.service","Sakai")}));
return null;
} else {
PrivateMessage pvtMsg = processPvtMsgReplyAllSendHelper(false, Boolean.TRUE);
if(pvtMsg == null){
return null;
}else{
return returnDraftPage();
}
}
}
public String processPvtMsgReplyAllSend() {
LOG.debug("processPvtMsgReply All Send()");
if (setDetailMsgCount != 1) {
setErrorMessage(getResourceBundleString(MULTIPLE_WINDOWS , new Object[] {ServerConfigurationService.getString("ui.service","Sakai")}));
return null;
} else {
PrivateMessage pvtMsg = processPvtMsgReplyAllSendHelper(false, Boolean.FALSE);
if(pvtMsg == null){
return null;
}else{
return DISPLAY_MESSAGES_PG;
}
}
}
private PrivateMessage processPvtMsgReplyAllSendHelper(boolean preview, Boolean isDraft){
PrivateMessage currentMessage = getDetailMsg().getMsg() ;
String msgauther=currentMessage.getAuthor();//string "Test"
//Select Forward Recipients
if(!hasValue(getForwardSubject()))
{
if(isDraft){
setErrorMessage(getResourceBundleString(MISSING_SUBJECT_DRAFT));
}else{
setErrorMessage(getResourceBundleString(MISSING_SUBJECT));
}
return null ;
}
PrivateMessage rrepMsg = messageManager.createPrivateMessage() ;
StringBuilder alertMsg = new StringBuilder();
rrepMsg.setTitle(FormattedText.processFormattedText(getForwardSubject(), alertMsg));
rrepMsg.setDraft(isDraft);
rrepMsg.setDeleted(Boolean.FALSE);
rrepMsg.setAuthor(getAuthorString());
rrepMsg.setApproved(Boolean.FALSE);
//add some emty space to the msg composite, by huxt
String replyAllbody=" ";
replyAllbody=getForwardBody();
rrepMsg.setBody(FormattedText.processFormattedText(replyAllbody, alertMsg));
rrepMsg.setLabel(getSelectedLabel());
rrepMsg.setInReplyTo(currentMessage) ;
//Add attachments
for(int i=0; i<allAttachments.size(); i++)
{
prtMsgManager.addAttachToPvtMsg(rrepMsg, ((DecoratedAttachment)allAttachments.get(i)).getAttachment());
}
User autheruser=null;
try {
autheruser = UserDirectoryService.getUser(currentMessage.getCreatedBy());
} catch (UserNotDefinedException e) {
e.printStackTrace();
}
List tmpRecipList = currentMessage.getRecipients();
Map<User, Boolean> returnSet = new HashMap<User, Boolean>();
StringBuffer sendToStringreplyall = new StringBuffer();
Iterator iter = tmpRecipList.iterator();
while (iter.hasNext())
{
PrivateMessageRecipient tmpPMR = (PrivateMessageRecipient)iter.next();
User replyrecipientaddtmp=null;
try {
replyrecipientaddtmp = UserDirectoryService.getUser(tmpPMR.getUserId());
} catch (UserNotDefinedException e) {
// TODO Auto-generated catch block
LOG.warn("Unable to find user : " + tmpPMR.getUserId(), e);
}
if (replyrecipientaddtmp == null){
LOG.warn("continuing passed user : "+tmpPMR.getUserId());
//throw new IllegalStateException("User replyrecipientaddtmp == null!");
}else{
if(!(replyrecipientaddtmp.getDisplayName()).equals(getUserName()) && !tmpPMR.getBcc())//&&(!(replyrecipientaddtmp.getDisplayName()).equals(msgauther)))
{
returnSet.put(replyrecipientaddtmp, tmpPMR.getBcc());
}
}
}
if(currentMessage.getRecipientsAsText() != null && !"".equals(currentMessage.getRecipientsAsText())){
sendToStringreplyall.append(currentMessage.getRecipientsAsText()).append("; ");
}
if(returnSet.isEmpty()) {
returnSet.put(autheruser, false);
if(!sendToStringreplyall.toString().contains(msgauther)){
//only add it to the reply string if it doesn't exist
sendToStringreplyall.append(msgauther).append("; ");
}
}
if(returnSet.containsKey(autheruser) && !sendToStringreplyall.toString().contains(msgauther)){
sendToStringreplyall.append(msgauther).append("; ");
}
//Add the recipientList as String for display in Sent folder
// Since some users may be hidden, if some of these are recipients
// filter them out (already checked if no recipients)
// if only 1 recipient no need to check visibility
StringBuffer sendToString = new StringBuffer(sendToStringreplyall);
StringBuffer sendToHiddenString = new StringBuffer();
if (selectedComposeToList.size() == 1) {
MembershipItem membershipItem = (MembershipItem) courseMemberMap.get(selectedComposeToList.get(0));
if(membershipItem != null)
{
sendToString.append(membershipItem.getName()).append("; ");
}
}
else {
for (int i = 0; i < selectedComposeToList.size(); i++)
{
MembershipItem membershipItem = (MembershipItem) courseMemberMap.get(selectedComposeToList.get(i));
if(membershipItem != null)
{
if(!sendToStringreplyall.toString().contains(membershipItem.getName())){
if (membershipItem.isViewable()) {
sendToString.append(membershipItem.getName()).append("; ");
}
else {
sendToHiddenString.append(membershipItem.getName()).append("; ");
}
}
}
}
}
//add bcc recipients place holder:
if(selectedComposeBccList.size() > 0 && !sendToString.toString().contains(getResourceBundleString(RECIPIENTS_UNDISCLOSED))){
sendToString.append(getResourceBundleString(RECIPIENTS_UNDISCLOSED)).append("; ");
}
//create sendToBccString
StringBuffer sendToBccString = new StringBuffer();
StringBuffer sendToBccHiddenString = new StringBuffer();
for (int i = 0; i < selectedComposeBccList.size(); i++)
{
MembershipItem membershipItem = (MembershipItem) courseMemberMap.get(selectedComposeBccList.get(i));
if(membershipItem != null)
{
if (membershipItem.isViewable()) {
sendToBccString.append(membershipItem.getName()).append("; ");
}
else {
sendToBccHiddenString.append(membershipItem.getName()).append("; ");
}
}
}
//clean sendToString
if (! "".equals(sendToString.toString()) && sendToString.length() >= 2) {
sendToString.delete(sendToString.length()-2, sendToString.length()); //remove last comma and space
}
if ("".equals(sendToHiddenString.toString())) {
rrepMsg.setRecipientsAsText(sendToString.toString());
}
else {
sendToHiddenString.delete(sendToHiddenString.length()-2, sendToHiddenString.length()); //remove last comma and space
rrepMsg.setRecipientsAsText(sendToString.toString() + " (" + sendToHiddenString.toString() + ")");
}
//clean sendToBccString
if (! "".equals(sendToBccString.toString()) && sendToBccString.length() >= 2) {
sendToBccString.delete(sendToBccString.length()-2, sendToBccString.length()); //remove last comma and space
}
if ("".equals(sendToBccHiddenString.toString())) {
rrepMsg.setRecipientsAsTextBcc(sendToBccString.toString());
}
else {
sendToBccHiddenString.delete(sendToBccHiddenString.length()-2, sendToBccHiddenString.length()); //remove last comma and space
rrepMsg.setRecipientsAsTextBcc(sendToBccString.toString() + " (" + sendToBccHiddenString.toString() + ")");
}
//Add selected users to reply all list
Map<User, Boolean> recipients = getRecipients();
for (Iterator<Entry<User, Boolean>> i = recipients.entrySet().iterator(); i.hasNext();){
Entry<User, Boolean> entrySet = (Entry<User, Boolean>) i.next();
if(!returnSet.containsKey(entrySet.getKey())){
returnSet.put(entrySet.getKey(), entrySet.getValue());
}
}
if(!preview){
prtMsgManager.sendPrivateMessage(rrepMsg, returnSet, isSendEmail());
if(!rrepMsg.getDraft()){
prtMsgManager.markMessageAsRepliedForUser(getReplyingMessage());
//update Synoptic tool info
incrementSynopticToolInfo(returnSet.keySet(), false);
LearningResourceStoreService lrss = (LearningResourceStoreService) ComponentManager
.get("org.sakaiproject.event.api.LearningResourceStoreService");
Event event = EventTrackingService.newEvent(DiscussionForumService.EVENT_MESSAGES_FORWARD, getEventMessage(rrepMsg), false);
EventTrackingService.post(event);
lrss.registerStatement(getStatementForUserSentPvtMsg(lrss.getEventActor(event), getDetailMsg().getMsg().getTitle(), SAKAI_VERB.responded), "msgcntr");
}
//reset contents
resetComposeContents();
}
return rrepMsg;
}
private boolean containedInList(User user,List list){
boolean isContain=false;
if (list==null)
{
return false;
}
Iterator iter = list.iterator();
User tmpuser=null;
while(iter.hasNext()){
PrivateMessageRecipient tmpPMR = (PrivateMessageRecipient)iter.next();
User replyrecipientaddtmp=null;
try {
replyrecipientaddtmp = UserDirectoryService.getUser(tmpPMR.getUserId());
} catch (UserNotDefinedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if((replyrecipientaddtmp!=null)&&(replyrecipientaddtmp==user)){
//tmplist.add(tmpPMR);
isContain=true;
}
}
return isContain;
}
/**
* process from Compose screen
* @return - pvtMsg
*/
public String processPvtMsgReplySaveDraft() {
PrivateMessage pvtMsg = getPvtMsgReplyMessage(getDetailMsg().getMsg(), true);
if(pvtMsg == null){
return null;
}else{
pvtMsg.setDraft(Boolean.TRUE);
setMsgNavMode(PVTMSG_MODE_DRAFT);
String returnVal = processPvtMsgReplySentAction(pvtMsg);
if(returnVal == null){
return null;
}else{
return returnDraftPage();
}
}
}
////////////////////////////////////////////////////////////////
public String processPvtMsgEmptyDelete() {
LOG.debug("processPvtMsgEmptyDelete()");
List delSelLs=new ArrayList() ;
//this.setDisplayPvtMsgs(getDisplayPvtMsgs());
for (Iterator iter = this.decoratedPvtMsgs.iterator(); iter.hasNext();)
{
PrivateMessageDecoratedBean element = (PrivateMessageDecoratedBean) iter.next();
if(element.getIsSelected())
{
delSelLs.add(element);
}
}
this.setSelectedDeleteItems(delSelLs);
if(delSelLs.size()<1)
{
setErrorMessage(getResourceBundleString(SELECT_MSGS_TO_DELETE));
return null; //stay in the same page if nothing is selected for delete
}else {
setErrorMessage(getResourceBundleString(CONFIRM_PERM_MSG_DELETE));
return DELETE_MESSAGE_PG;
}
}
//delete private message
public String processPvtMsgMultiDelete()
{
LOG.debug("processPvtMsgMultiDelete()");
boolean deleted = false;
for (Iterator iter = getSelectedDeleteItems().iterator(); iter.hasNext();)
{
PrivateMessage element = ((PrivateMessageDecoratedBean) iter.next()).getMsg();
if (element != null)
{
deleted = true;
prtMsgManager.deletePrivateMessage(element, getPrivateMessageTypeFromContext(msgNavMode)) ;
}
if ("pvt_deleted".equals(msgNavMode))
EventTrackingService.post(EventTrackingService.newEvent(DiscussionForumService.EVENT_MESSAGES_REMOVE, getEventMessage((Message) element), false));
else
EventTrackingService.post(EventTrackingService.newEvent(DiscussionForumService.EVENT_MESSAGES_MOVE_TO_DELETED_FOLDER, getEventMessage((Message) element), false));
}
if (deleted)
{
if ("pvt_deleted".equals(msgNavMode))
multiDeleteSuccessMsg = getResourceBundleString(PERM_DELETE_SUCCESS_MSG);
else
multiDeleteSuccessMsg = getResourceBundleString(MULTIDELETE_SUCCESS_MSG);
multiDeleteSuccess = true;
}
return DISPLAY_MESSAGES_PG;
}
public String processPvtMsgDispOtions()
{
LOG.debug("processPvtMsgDispOptions()");
return "pvtMsgOrganize" ;
}
/////////////////////////// Process Select All ///////////////////////////////
private boolean selectAll = false;
private int numberChecked = 0; // to cover case where user selectes check all
public boolean isSelectAll()
{
return selectAll;
}
public void setSelectAll(boolean selectAll)
{
this.selectAll = selectAll;
}
public int getNumberChecked()
{
return numberChecked;
}
/**
* process isSelected for all decorated messages
* @return same page i.e. will be pvtMsg
*/
public String processCheckAll()
{
LOG.debug("processCheckAll()");
selectAll= true;
multiDeleteSuccess = false;
return null;
}
////////////////////////////// ATTACHMENT PROCESSING //////////////////////////
private ArrayList attachments = new ArrayList();
private String removeAttachId = null;
private ArrayList prepareRemoveAttach = new ArrayList();
private boolean attachCaneled = false;
private ArrayList oldAttachments = new ArrayList();
private List allAttachments = new ArrayList();
public ArrayList getAttachments()
{
ToolSession session = SessionManager.getCurrentToolSession();
if (session.getAttribute(FilePickerHelper.FILE_PICKER_CANCEL) == null &&
session.getAttribute(FilePickerHelper.FILE_PICKER_ATTACHMENTS) != null)
{
List refs = (List)session.getAttribute(FilePickerHelper.FILE_PICKER_ATTACHMENTS);
if(refs != null && refs.size()>0)
{
Reference ref = (Reference)refs.get(0);
for(int i=0; i<refs.size(); i++)
{
ref = (Reference) refs.get(i);
Attachment thisAttach = prtMsgManager.createPvtMsgAttachment(
ref.getId(), ref.getProperties().getProperty(ref.getProperties().getNamePropDisplayName()));
//TODO - remove this as being set for test only
//thisAttach.setPvtMsgAttachId(Long.valueOf(1));
attachments.add(new DecoratedAttachment(thisAttach));
}
}
}
session.removeAttribute(FilePickerHelper.FILE_PICKER_ATTACHMENTS);
session.removeAttribute(FilePickerHelper.FILE_PICKER_CANCEL);
return attachments;
}
public List getAllAttachments()
{
ToolSession session = SessionManager.getCurrentToolSession();
if (session.getAttribute(FilePickerHelper.FILE_PICKER_CANCEL) == null &&
session.getAttribute(FilePickerHelper.FILE_PICKER_ATTACHMENTS) != null)
{
List refs = (List)session.getAttribute(FilePickerHelper.FILE_PICKER_ATTACHMENTS);
if(refs != null && refs.size()>0)
{
Reference ref = (Reference)refs.get(0);
for(int i=0; i<refs.size(); i++)
{
ref = (Reference) refs.get(i);
Attachment thisAttach = prtMsgManager.createPvtMsgAttachment(
ref.getId(), ref.getProperties().getProperty(ref.getProperties().getNamePropDisplayName()));
//TODO - remove this as being set for test only
//thisAttach.setPvtMsgAttachId(Long.valueOf(1));
allAttachments.add(new DecoratedAttachment(thisAttach));
}
}
}
session.removeAttribute(FilePickerHelper.FILE_PICKER_ATTACHMENTS);
session.removeAttribute(FilePickerHelper.FILE_PICKER_CANCEL);
// if( allAttachments == null || (allAttachments.size()<1))
// {
// allAttachments.addAll(this.getDetailMsg().getMsg().getAttachments()) ;
// }
return allAttachments;
}
public void setAttachments(ArrayList attachments)
{
this.attachments = attachments;
}
public String getRemoveAttachId()
{
return removeAttachId;
}
public final void setRemoveAttachId(String removeAttachId)
{
this.removeAttachId = removeAttachId;
}
public ArrayList getPrepareRemoveAttach()
{
if((removeAttachId != null) && (!"".equals(removeAttachId)))
{
prepareRemoveAttach.add(prtMsgManager.getPvtMsgAttachment(Long.valueOf(removeAttachId)));
}
return prepareRemoveAttach;
}
public final void setPrepareRemoveAttach(ArrayList prepareRemoveAttach)
{
this.prepareRemoveAttach = prepareRemoveAttach;
}
//Redirect to File picker
public String processAddAttachmentRedirect()
{
LOG.debug("processAddAttachmentRedirect()");
try
{
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
context.redirect("sakai.filepicker.helper/tool");
return null;
}
catch(Exception e)
{
LOG.debug("processAddAttachmentRedirect() - Exception");
return null;
}
}
//Process remove attachment
public String processDeleteAttach()
{
LOG.debug("processDeleteAttach()");
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
String attachId = null;
Map paramMap = context.getRequestParameterMap();
Iterator<Entry<Object, String>> itr = paramMap.entrySet().iterator();
while(itr.hasNext())
{
Entry<Object, String> entry = itr.next();
Object key = entry.getKey();
if( key instanceof String)
{
String name = (String)key;
int pos = name.lastIndexOf("pvmsg_current_attach");
if(pos>=0 && name.length()==pos+"pvmsg_current_attach".length())
{
attachId = entry.getValue();
break;
}
}
}
if ((attachId != null) && (!"".equals(attachId)))
{
for (int i = 0; i < attachments.size(); i++)
{
if (attachId.equalsIgnoreCase(((DecoratedAttachment) attachments.get(i)).getAttachment()
.getAttachmentId()))
{
attachments.remove(i);
break;
}
}
}
return null ;
}
//Process remove attachments from reply message
public String processDeleteReplyAttach()
{
LOG.debug("processDeleteReplyAttach()");
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
String attachId = null;
Map paramMap = context.getRequestParameterMap();
Iterator<Entry<Object, String>> itr = paramMap.entrySet().iterator();
while(itr.hasNext())
{
Entry<Object, String> entry = itr.next();
Object key = entry.getKey();
if( key instanceof String)
{
String name = (String)key;
int pos = name.lastIndexOf("remsg_current_attach");
if(pos>=0 && name.length()==pos+"remsg_current_attach".length())
{
attachId = entry.getValue();
break;
}
}
}
if ((attachId != null) && (!"".equals(attachId)))
{
for (int i = 0; i < allAttachments.size(); i++)
{
if (attachId.equalsIgnoreCase(((DecoratedAttachment) allAttachments.get(i)).getAttachment()
.getAttachmentId()))
{
allAttachments.remove(i);
break;
}
}
}
return null ;
}
//process deleting confirm from separate screen
public String processRemoveAttach()
{
LOG.debug("processRemoveAttach()");
try
{
Attachment sa = prtMsgManager.getPvtMsgAttachment(Long.valueOf(removeAttachId));
String id = sa.getAttachmentId();
for(int i=0; i<attachments.size(); i++)
{
DecoratedAttachment thisAttach = (DecoratedAttachment)attachments.get(i);
if(((Long)thisAttach.getAttachment().getPvtMsgAttachId()).toString().equals(removeAttachId))
{
attachments.remove(i);
break;
}
}
prtMsgManager.removePvtMsgAttachment(sa);
if(id.toLowerCase().startsWith("/attachment"))
contentHostingService.removeResource(id);
}
catch(Exception e)
{
LOG.debug("processRemoveAttach() - Exception");
}
removeAttachId = null;
prepareRemoveAttach.clear();
return COMPOSE_MSG_PG;
}
public String processRemoveAttachCancel()
{
LOG.debug("processRemoveAttachCancel()");
removeAttachId = null;
prepareRemoveAttach.clear();
return COMPOSE_MSG_PG ;
}
//////////// SETTINGS //////////////////////////////
//Setting Getter and Setter
public String getActivatePvtMsg()
{
return activatePvtMsg;
}
public void setActivatePvtMsg(String activatePvtMsg)
{
this.activatePvtMsg = activatePvtMsg;
}
public String getForwardPvtMsg()
{
return forwardPvtMsg;
}
public void setForwardPvtMsg(String forwardPvtMsg)
{
this.forwardPvtMsg = forwardPvtMsg;
}
public String getForwardPvtMsgEmail()
{
return forwardPvtMsgEmail;
}
public void setForwardPvtMsgEmail(String forwardPvtMsgEmail)
{
this.forwardPvtMsgEmail = forwardPvtMsgEmail;
}
public String getSendToEmail() {
return this.sendToEmail;
}
public void setSendToEmail(String sendToEmail) {
this.sendToEmail = sendToEmail;
}
public boolean getSuperUser()
{
superUser=SecurityService.isSuperUser();
return superUser;
}
//is instructor
public boolean isInstructor()
{
return prtMsgManager.isInstructor();
}
public boolean isEmailPermit() {
return prtMsgManager.isEmailPermit();
}
public void setSuperUser(boolean superUser)
{
this.superUser = superUser;
}
public String processPvtMsgOrganize()
{
LOG.debug("processPvtMsgOrganize()");
return null ;
//return "pvtMsgOrganize";
}
public String processPvtMsgStatistics()
{
LOG.debug("processPvtMsgStatistics()");
return null ;
//return "pvtMsgStatistics";
}
public String processPvtMsgSettings()
{
LOG.debug("processPvtMsgSettings()");
return MESSAGE_SETTING_PG;
}
public void processPvtMsgSettingsRevise(ValueChangeEvent event)
{
LOG.debug("processPvtMsgSettingsRevise()");
/** block executes when changing value to "no" */
if (SET_AS_YES.equals(forwardPvtMsg)){
setForwardPvtMsgEmail(null);
}
if (SET_AS_NO.equals(forwardPvtMsg)){
setValidEmail(true);
}
}
public String processPvtMsgSettingsSave()
{
LOG.debug("processPvtMsgSettingsSave()");
String email= getForwardPvtMsgEmail();
String activate=getActivatePvtMsg() ;
String forward=getForwardPvtMsg() ;
if (email != null && (!SET_AS_NO.equals(forward))
&& !EmailValidator.getInstance().isValid(email) ) {
setValidEmail(false);
setErrorMessage(getResourceBundleString(PROVIDE_VALID_EMAIL));
setActivatePvtMsg(activate);
return MESSAGE_SETTING_PG;
}
else
{
Area area = prtMsgManager.getPrivateMessageArea();
Boolean formAreaEnabledValue = (SET_AS_YES.equals(activate)) ? Boolean.TRUE : Boolean.FALSE;
area.setEnabled(formAreaEnabledValue);
try {
int formSendToEmail = Integer.parseInt(sendToEmail);
area.setSendToEmail(formSendToEmail);
} catch (NumberFormatException nfe) {
// if this happens, there is likely something wrong in the UI that needs to be fixed
LOG.warn("Non-numeric option for sending email to recipient email address on Message screen. This may indicate a UI problem.");
setErrorMessage(getResourceBundleString("pvt_send_to_email_invalid"));
return MESSAGE_SETTING_PG;
}
Boolean formAutoForward = (SET_AS_YES.equals(forward)) ? Boolean.TRUE : Boolean.FALSE;
forum.setAutoForward(formAutoForward);
if (Boolean.TRUE.equals(formAutoForward)){
forum.setAutoForwardEmail(email);
}
else{
forum.setAutoForwardEmail(null);
}
area.setHiddenGroups(new HashSet(hiddenGroups));
prtMsgManager.saveAreaAndForumSettings(area, forum);
if (isMessagesandForums()) {
return MAIN_PG;
}
else {
return MESSAGE_HOME_PG;
}
}
}
/////////////////// FOLDER SETTINGS ///////////////////////
private String addFolder;
private boolean ismutable;
private int totalMsgInFolder;
public String getAddFolder()
{
return addFolder ;
}
public void setAddFolder(String addFolder)
{
this.addFolder=addFolder;
}
public boolean getIsmutable()
{
return prtMsgManager.isMutableTopicFolder(getSelectedTopicId());
}
public int getTotalMsgInFolder()
{
return totalMsgInFolder;
}
public void setTotalMsgInFolder(int totalMsgInFolder)
{
this.totalMsgInFolder = totalMsgInFolder;
}
//navigated from header pagecome from Header page
public String processPvtMsgFolderSettings() {
LOG.debug("processPvtMsgFolderSettings()");
//String topicTitle= getExternalParameterByKey("pvtMsgTopicTitle");
String topicTitle = forumManager.getTopicByUuid(getExternalParameterByKey("pvtMsgTopicId")).getTitle();
setSelectedTopicTitle(topicTitle) ;
String topicId=getExternalParameterByKey("pvtMsgTopicId") ;
setSelectedTopicId(topicId);
setFromMainOrHp();
return MESSAGE_FOLDER_SETTING_PG;
}
public String processPvtMsgFolderSettingRevise() {
LOG.debug("processPvtMsgFolderSettingRevise()");
if(this.ismutable)
{
return null;
}else
{
selectedNewTopicTitle = selectedTopicTitle;
return REVISE_FOLDER_PG ;
}
}
public String processPvtMsgFolderSettingAdd() {
LOG.debug("processPvtMsgFolderSettingAdd()");
setFromMainOrHp();
this.setAddFolder(""); // make sure the input box is empty
return ADD_MESSAGE_FOLDER_PG ;
}
public String processPvtMsgFolderSettingDelete() {
LOG.debug("processPvtMsgFolderSettingDelete()");
setFromMainOrHp();
String typeUuid = getPrivateMessageTypeFromContext(selectedTopicTitle);
setTotalMsgInFolder(prtMsgManager.findMessageCount(typeUuid, aggregateList));
if(ismutable)
{
setErrorMessage(getResourceBundleString(CANNOT_DEL_REVISE_FOLDER));
return null;
}else {
setErrorMessage(getResourceBundleString(CONFIRM_FOLDER_DELETE));
return DELETE_FOLDER_PG;
}
}
public String processPvtMsgReturnToMainOrHp()
{
LOG.debug("processPvtMsgReturnToMainOrHp()");
if(fromMainOrHp != null && (fromMainOrHp.equals(MESSAGE_HOME_PG) || (fromMainOrHp.equals(MAIN_PG))))
{
String returnToPage = fromMainOrHp;
fromMainOrHp = "";
return returnToPage;
}
else
{
return MAIN_PG ;
}
}
public String processPvtMsgReturnToFolderView()
{
return MESSAGE_FOLDER_SETTING_PG;
}
//Create a folder within a forum
public String processPvtMsgFldCreate()
{
LOG.debug("processPvtMsgFldCreate()");
String createFolder=getAddFolder() ;
StringBuilder alertMsg = new StringBuilder();
createFolder = FormattedText.processFormattedText(createFolder, alertMsg);
if(createFolder == null || createFolder.trim().length() == 0)
{
setErrorMessage(getResourceBundleString(ENTER_FOLDER_NAME));
return null ;
} else if((PVTMSG_MODE_RECEIVED.toLowerCase()).equals(createFolder.toLowerCase().trim()) || (PVTMSG_MODE_SENT.toLowerCase()).equals(createFolder.toLowerCase().trim())||
(PVTMSG_MODE_DELETE.toLowerCase()).equals(createFolder.toLowerCase().trim()) || (PVTMSG_MODE_DRAFT.toLowerCase()).equals(createFolder.toLowerCase().trim()))
{
setErrorMessage(getResourceBundleString(CREATE_DIFF_FOLDER_NAME));
return null;
} else if(createFolder.length() > 100)
{
setErrorMessage(getResourceBundleString(ENTER_SHORTER_NAME));
return null;
} else
{
prtMsgManager.createTopicFolderInForum(forum, createFolder);
//create a typeUUID in commons
String newTypeUuid= typeManager.getCustomTopicType(createFolder);
}
//since PrivateMessagesTool has a session scope,
//reset addFolder to blank for new form
addFolder = "";
return processPvtMsgReturnToMainOrHp();
}
private String selectedNewTopicTitle=selectedTopicTitle; //default
public String getSelectedNewTopicTitle()
{
return selectedNewTopicTitle;
}
public void setSelectedNewTopicTitle(String selectedNewTopicTitle)
{
this.selectedNewTopicTitle = selectedNewTopicTitle;
}
/**
* revise
**/
public String processPvtMsgFldRevise()
{
LOG.debug("processPvtMsgFldRevise()");
String newTopicTitle = this.getSelectedNewTopicTitle();
if(!hasValue(newTopicTitle))
{
setErrorMessage(getResourceBundleString(FOLDER_NAME_BLANK));
return REVISE_FOLDER_PG;
}
else if((PVTMSG_MODE_RECEIVED.toLowerCase()).equals(newTopicTitle.toLowerCase().trim()) || (PVTMSG_MODE_SENT.toLowerCase()).equals(newTopicTitle.toLowerCase().trim())||
(PVTMSG_MODE_DELETE.toLowerCase()).equals(newTopicTitle.toLowerCase().trim()) || (PVTMSG_MODE_DRAFT.toLowerCase()).equals(newTopicTitle.toLowerCase().trim()))
{
setErrorMessage(getResourceBundleString(CREATE_DIFF_FOLDER_NAME));
return REVISE_FOLDER_PG;
}
else if(newTopicTitle.length() > 100)
{
setErrorMessage(getResourceBundleString(ENTER_SHORTER_NAME));
return REVISE_FOLDER_PG;
}
else {
List tmpMsgList = prtMsgManager.getMessagesByType(typeManager.getCustomTopicType(prtMsgManager.getTopicByUuid(selectedTopicId).getTitle()), PrivateMessageManager.SORT_COLUMN_DATE,
PrivateMessageManager.SORT_ASC);
prtMsgManager.renameTopicFolder(forum, selectedTopicId, newTopicTitle);
//rename topic in commons -- as messages are linked through commons type
//TODO - what if more than one type objects are returned-- We need to switch from title
String newTypeUuid = typeManager.renameCustomTopicType(selectedTopicTitle, newTopicTitle);
for(int i=0; i<tmpMsgList.size(); i++)
{
PrivateMessage tmpPM = (PrivateMessage) tmpMsgList.get(i);
List tmpRecipList = tmpPM.getRecipients();
tmpPM.setTypeUuid(newTypeUuid);
String currentUserId = SessionManager.getCurrentSessionUserId();
Iterator iter = tmpRecipList.iterator();
while(iter.hasNext())
{
PrivateMessageRecipient tmpPMR = (PrivateMessageRecipient) iter.next();
if(tmpPMR != null && tmpPMR.getUserId().equals(currentUserId))
{
tmpPMR.setTypeUuid(newTypeUuid);
}
}
tmpPM.setRecipients(tmpRecipList);
prtMsgManager.savePrivateMessage(tmpPM, false);
}
}
setSelectedTopicTitle(newTopicTitle) ;
return MESSAGE_FOLDER_SETTING_PG ;
}
//Delete
public String processPvtMsgFldDelete()
{
LOG.debug("processPvtMsgFldDelete()");
prtMsgManager.deleteTopicFolder(forum,getSelectedTopicId()) ;
//delete the messages
String typeUuid = getPrivateMessageTypeFromContext(selectedTopicTitle);
List allPvtMsgs= prtMsgManager.getMessagesByType(typeUuid,PrivateMessageManager.SORT_COLUMN_DATE,
PrivateMessageManager.SORT_DESC);
for (Iterator iter = allPvtMsgs.iterator(); iter.hasNext();)
{
PrivateMessage element = (PrivateMessage) iter.next();
prtMsgManager.deletePrivateMessage(element, typeUuid);
}
return processPvtMsgReturnToMainOrHp();
}
//create folder within folder
public String processPvtMsgFolderInFolderAdd()
{
LOG.debug("processPvtMsgFolderSettingAdd()");
setFromMainOrHp();
this.setAddFolder("");
return ADD_FOLDER_IN_FOLDER_PG ;
}
//create folder within Folder
//TODO - add parent fodler id for this
public String processPvtMsgFldInFldCreate()
{
LOG.debug("processPvtMsgFldCreate()");
PrivateTopic parentTopic=(PrivateTopic) prtMsgManager.getTopicByUuid(selectedTopicId);
String createFolder=getAddFolder() ;
if(createFolder == null || createFolder.trim().length() == 0)
{
setErrorMessage(getResourceBundleString(ENTER_FOLDER_NAME));
return null ;
}
else if((PVTMSG_MODE_RECEIVED.toLowerCase()).equals(createFolder.toLowerCase().trim()) || (PVTMSG_MODE_SENT.toLowerCase()).equals(createFolder.toLowerCase().trim())||
(PVTMSG_MODE_DELETE.toLowerCase()).equals(createFolder.toLowerCase().trim()) || (PVTMSG_MODE_DRAFT.toLowerCase()).equals(createFolder.toLowerCase().trim()))
{
setErrorMessage(getResourceBundleString(CREATE_DIFF_FOLDER_NAME));
return null;
}
else if(createFolder.length() > 100)
{
setErrorMessage(getResourceBundleString(ENTER_SHORTER_NAME));
return null;
}
else
{
prtMsgManager.createTopicFolderInTopic(forum, parentTopic, createFolder);
//create a typeUUID in commons
String newTypeUuid= typeManager.getCustomTopicType(createFolder);
}
addFolder = "";
return processPvtMsgReturnToMainOrHp();
}
///////////////////// MOVE //////////////////////
private String moveToTopic="";
private String moveToNewTopic="";
public String getMoveToTopic()
{
if(hasValue(moveToNewTopic))
{
moveToTopic=moveToNewTopic;
}
return moveToTopic;
}
public void setMoveToTopic(String moveToTopic)
{
this.moveToTopic = moveToTopic;
}
/**
* called from Single delete Page
* @return - pvtMsgMove
*/
public String processPvtMsgMove() {
LOG.debug("processPvtMsgMove()");
return MOVE_MESSAGE_PG;
}
public void processPvtMsgParentFolderMove(ValueChangeEvent event)
{
LOG.debug("processPvtMsgSettingsRevise()");
if ((String)event.getNewValue() != null)
{
moveToNewTopic= (String)event.getNewValue();
}
}
public String processPvtMsgMoveMessage()
{
LOG.debug("processPvtMsgMoveMessage()");
String moveTopicTitle=getMoveToTopic(); //this is uuid of new topic
if( moveTopicTitle == null || moveTopicTitle.trim().length() == 0){
setErrorMessage(getResourceBundleString(MOVE_MSG_ERROR));
return null;
}
Topic newTopic= prtMsgManager.getTopicByUuid(moveTopicTitle);
Topic oldTopic=selectedTopic.getTopic();
if (newTopic.getUuid().equals(oldTopic.getUuid())) {
//error
setErrorMessage(getResourceBundleString(MOVE_MSG_ERROR));
return null;
}
else{
if (selectedMoveToFolderItems == null)
{
prtMsgManager.movePvtMsgTopic(detailMsg.getMsg(), oldTopic, newTopic);
}
else
{
for (Iterator movingIter = selectedMoveToFolderItems.iterator(); movingIter.hasNext();)
{
PrivateMessageDecoratedBean decoMessage = (PrivateMessageDecoratedBean) movingIter.next();
final PrivateMessage initPrivateMessage = prtMsgManager.initMessageWithAttachmentsAndRecipients(decoMessage.getMsg());
decoMessage = new PrivateMessageDecoratedBean(initPrivateMessage);
prtMsgManager.movePvtMsgTopic(decoMessage.getMsg(), oldTopic, newTopic);
}
}
//reset
moveToTopic="";
moveToNewTopic="";
selectedMoveToFolderItems = null;
// Return to Messages & Forums page or Messages page
if (isMessagesandForums())
{
return MAIN_PG;
}
else
{
return MESSAGE_HOME_PG;
}
}
}
/**
*
* @return
*/
public String processPvtMsgCancelToDetailView()
{
LOG.debug("processPvtMsgCancelToDetailView()");
this.deleteConfirm=false;
// due to adding ability to move multiple messages
if (selectedMoveToFolderItems != null)
{
selectedMoveToFolderItems = null;
return DISPLAY_MESSAGES_PG;
}
return SELECTED_MESSAGE_PG;
}
/////////////// SEARCH ///////////////////////
private List searchPvtMsgs;
public List getSearchPvtMsgs()
{
if(selectView!=null && selectView.equalsIgnoreCase(THREADED_VIEW))
{
this.rearrageTopicMsgsThreaded(true);
}
// If "check all", update the decorated pmb to show selected
if (selectAll)
{
Iterator searchIter = searchPvtMsgs.iterator();
while (searchIter.hasNext())
{
PrivateMessageDecoratedBean searchMsg = (PrivateMessageDecoratedBean)searchIter.next();
searchMsg.setIsSelected(true);
}
selectAll = false;
}
return searchPvtMsgs;
}
public void setSearchPvtMsgs(List searchPvtMsgs)
{
this.searchPvtMsgs=searchPvtMsgs ;
}
public String processSearch()
{
LOG.debug("processSearch()");
multiDeleteSuccess = false;
List newls = new ArrayList() ;
// for (Iterator iter = getDecoratedPvtMsgs().iterator(); iter.hasNext();)
// {
// PrivateMessageDecoratedBean element = (PrivateMessageDecoratedBean) iter.next();
//
// String message=element.getMsg().getTitle();
// String searchText = getSearchText();
// //if search on subject is set - default is true
// if(searchOnSubject)
// {
// StringTokenizer st = new StringTokenizer(message);
// while (st.hasMoreTokens())
// {
// if(st.nextToken().matches("(?i).*getSearchText().*")) //matches anywhere
// //if(st.nextToken().equalsIgnoreCase(getSearchText()))
// {
// newls.add(element) ;
// break;
// }
// }
// }
// //is search
//
// }
/**TODO -
* In advance srearch as there can be ANY type of combination like selection of
* ANY 1 or 2 or 3 or 4 or 5 options like - subject, Author By, label, body and date
* so all possible cases are taken care off.
* This doesn't look nice, but good this is that we are using same method - our backend is cleaner
* First - checked if date is selected then purmutation of 4 options
* ELSE - permutations of other 4 options
*/
List tempPvtMsgLs= new ArrayList();
if(searchOnDate && searchFromDate == null && searchToDate==null)
{
setErrorMessage(getResourceBundleString(MISSING_BEG_END_DATE));
}
if(!hasValue(searchText))
{
setErrorMessage(getResourceBundleString(ENTER_SEARCH_TEXT));
}
tempPvtMsgLs= prtMsgManager.searchPvtMsgs(getPrivateMessageTypeFromContext(msgNavMode),
getSearchText(), getSearchFromDate(), getSearchToDate(),
searchOnSubject, searchOnAuthor, searchOnBody, searchOnLabel, searchOnDate) ;
newls= createDecoratedDisplay(tempPvtMsgLs);
//
// for (Iterator iter = tempPvtMsgLs.iterator(); iter.hasNext();)
// {
// PrivateMessage element = (PrivateMessage) iter.next();
// PrivateMessageDecoratedBean dbean = new PrivateMessageDecoratedBean(element);
//
// //getRecipients() is filtered for this perticular user i.e. returned list of only one PrivateMessageRecipient object
// for (Iterator iterator = element.getRecipients().iterator(); iterator.hasNext();)
// {
// PrivateMessageRecipient el = (PrivateMessageRecipient) iterator.next();
// if (el != null){
// if(!el.getRead().booleanValue())
// {
// dbean.setHasRead(el.getRead().booleanValue());
// break;
// }
// }
// }
// //Add decorate 'TO' String for sent message
// if(PVTMSG_MODE_SENT.equals(msgNavMode))
// {
// dbean.setSendToStringDecorated(createDecoratedSentToDisplay(dbean));
// }
// newls.add(dbean);
// }
//set threaded view as false in search
selectView="";
if(newls.size()>0)
{
this.setSearchPvtMsgs(newls) ;
return SEARCH_RESULT_MESSAGES_PG ;
}
else
{
setErrorMessage(getResourceBundleString(NO_MATCH_FOUND));
return null;
}
}
/**
* Clear Search text
*/
public String processClearSearch()
{
searchText="";
if(searchPvtMsgs != null)
{
searchPvtMsgs.clear();
//searchPvtMsgs= decoratedPvtMsgs;
}
searchOnBody=false ;
searchOnSubject=true;
searchOnLabel= false ;
searchOnAuthor=false;
searchOnDate=false;
searchFromDate=null;
searchToDate=null;
return DISPLAY_MESSAGES_PG;
}
public boolean searchOnBody=false ;
public boolean searchOnSubject=true; //default is search on Subject
public boolean searchOnLabel= false ;
public boolean searchOnAuthor=false;
public boolean searchOnDate=false;
public Date searchFromDate;
public Date searchToDate;
public boolean isSearchOnAuthor()
{
return searchOnAuthor;
}
public void setSearchOnAuthor(boolean searchOnAuthor)
{
this.searchOnAuthor = searchOnAuthor;
}
public boolean isSearchOnBody()
{
return searchOnBody;
}
public void setSearchOnBody(boolean searchOnBody)
{
this.searchOnBody = searchOnBody;
}
public boolean isSearchOnLabel()
{
return searchOnLabel;
}
public void setSearchOnLabel(boolean searchOnLabel)
{
this.searchOnLabel = searchOnLabel;
}
public boolean isSearchOnSubject()
{
return searchOnSubject;
}
public void setSearchOnSubject(boolean searchOnSubject)
{
this.searchOnSubject = searchOnSubject;
}
public boolean isSearchOnDate()
{
return searchOnDate;
}
public void setSearchOnDate(boolean searchOnDate)
{
this.searchOnDate = searchOnDate;
}
public Date getSearchFromDate()
{
return searchFromDate;
}
public void setSearchFromDate(Date searchFromDate)
{
this.searchFromDate = searchFromDate;
}
public Date getSearchToDate()
{
return searchToDate;
}
public void setSearchToDate(Date searchToDate)
{
this.searchToDate = searchToDate;
}
////////////// HELPER //////////////////////////////////
/**
* @return
*/
private String getExternalParameterByKey(String parameterId)
{
ExternalContext context = FacesContext.getCurrentInstance()
.getExternalContext();
Map paramMap = context.getRequestParameterMap();
return (String) paramMap.get(parameterId);
}
/**
* decorated display - from List of Message
*/
public List createDecoratedDisplay(List msg)
{
List decLs= new ArrayList() ;
numberChecked = 0;
for (Iterator iter = msg.iterator(); iter.hasNext();)
{
PrivateMessage element = (PrivateMessage) iter.next();
PrivateMessageDecoratedBean dbean= new PrivateMessageDecoratedBean(element);
//if processSelectAll is set, then set isSelected true for all messages,
if(selectAll)
{
dbean.setIsSelected(true);
numberChecked++;
}
//getRecipients() is filtered for this particular user i.e. returned list of only one PrivateMessageRecipient object
for (Iterator iterator = element.getRecipients().iterator(); iterator.hasNext();)
{
PrivateMessageRecipient el = (PrivateMessageRecipient) iterator.next();
if (el != null){
dbean.setHasRead(el.getRead().booleanValue());
dbean.setReplied(el.getReplied().booleanValue());
}
}
//Add decorate 'TO' String for sent message
if(PVTMSG_MODE_SENT.equals(msgNavMode))
{
dbean.setSendToStringDecorated(createDecoratedSentToDisplay(dbean));
}
decLs.add(dbean) ;
}
//reset selectAll flag, for future use
selectAll=false;
return decLs;
}
/**
* create decorated display for Sent To display for Sent folder
* @param dbean
* @return
*/
public String createDecoratedSentToDisplay(PrivateMessageDecoratedBean dbean)
{
String deocratedToDisplay="";
if(dbean.getMsg().getRecipientsAsText() != null)
{
if (dbean.getMsg().getRecipientsAsText().length()>25)
{
deocratedToDisplay=(dbean.getMsg().getRecipientsAsText()).substring(0, 20)+" (..)";
} else
{
deocratedToDisplay=dbean.getMsg().getRecipientsAsText();
}
}
return deocratedToDisplay;
}
/**
* get recipients
* @return a set of recipients (User objects)
*/
private Map<User, Boolean> getRecipients()
{
Map<User, Boolean> returnSet = new HashMap<User, Boolean>();
/** get List of unfiltered course members */
List allCourseUsers = membershipManager.getAllCourseUsers();
Map<User, Boolean> composeToSet = getRecipientsHelper(getSelectedComposeToList(), allCourseUsers, false);
Map<User, Boolean> composeBccSet = getRecipientsHelper(getSelectedComposeBccList(), allCourseUsers, true);
//first add the BCC list, then remove the duplicates, then add the regular To list
//Do this to make the regular TO list have precident over the BCC list. This is done
//because of the recipientsAsText list that is created. When replying, it would cause
//names to show up that are BCC'ed, and who don't actually get replies
returnSet.putAll(composeBccSet);
//remove all duplicates by doing this first:
for (Iterator iterator = composeToSet.keySet().iterator(); iterator.hasNext();) {
User user = (User) iterator.next();
if(returnSet.containsKey(user)){
returnSet.remove(user);
}
}
//now add them all back
returnSet.putAll(composeToSet);
return returnSet;
}
//=========HUXT BEGIN
private Map<User, Boolean> getRecipientsHelper(List selectedList, List allCourseUsers, boolean bcc){
Map<User, Boolean> returnSet = new HashMap<User, Boolean>();
for (Iterator i = selectedList.iterator(); i.hasNext();){
String selectedItem = (String) i.next();
/** lookup item in map */
MembershipItem item = (MembershipItem) courseMemberMap.get(selectedItem);
if (item == null){
LOG.warn("getRecipients() could not resolve uuid: " + selectedItem);
}
else{
if (MembershipItem.TYPE_ALL_PARTICIPANTS.equals(item.getType())){
for (Iterator a = allCourseUsers.iterator(); a.hasNext();){
MembershipItem member = (MembershipItem) a.next();
returnSet.put(member.getUser(), bcc);
}
//if all users have been selected we may as well return and ignore any other entries
return returnSet;
}
else if (MembershipItem.TYPE_ROLE.equals(item.getType())){
for (Iterator r = allCourseUsers.iterator(); r.hasNext();){
MembershipItem member = (MembershipItem) r.next();
if (member.getRole().equals(item.getRole())){
returnSet.put(member.getUser(), bcc);
}
}
}
else if (MembershipItem.TYPE_GROUP.equals(item.getType())){
for (Iterator g = allCourseUsers.iterator(); g.hasNext();){
MembershipItem member = (MembershipItem) g.next();
Set groupMemberSet = item.getGroup().getMembers();
for (Iterator s = groupMemberSet.iterator(); s.hasNext();){
Member m = (Member) s.next();
if (m.getUserId() != null && m.getUserId().equals(member.getUser().getId())){
returnSet.put(member.getUser(), bcc);
}
}
}
}
else if (MembershipItem.TYPE_USER.equals(item.getType())){
returnSet.put(item.getUser(), bcc);
}
else{
LOG.warn("getRecipients() could not resolve membership type: " + item.getType());
}
}
}
return returnSet;
}
//=========huxt ENG
/**
* getUserRecipients
* @param courseMembers
* @return set of all User objects for course
*/
private Set getUserRecipients(Set courseMembers){
Set returnSet = new HashSet();
for (Iterator i = courseMembers.iterator(); i.hasNext();){
MembershipItem item = (MembershipItem) i.next();
returnSet.add(item.getUser());
}
return returnSet;
}
/**
* getUserRecipientsForRole
* @param roleName
* @param courseMembers
* @return set of all User objects for role
*/
private Set getUserRecipientsForRole(String roleName, Set courseMembers){
Set returnSet = new HashSet();
for (Iterator i = courseMembers.iterator(); i.hasNext();){
MembershipItem item = (MembershipItem) i.next();
if (item.getRole().getId().equalsIgnoreCase(roleName)){
returnSet.add(item.getUser());
}
}
return returnSet;
}
private String getPrivateMessageTypeFromContext(String navMode){
if(PVTMSG_MODE_RECEIVED.equals(navMode))
return typeManager.getReceivedPrivateMessageType();
else if(PVTMSG_MODE_SENT.equals(navMode))
return typeManager.getSentPrivateMessageType();
else if(PVTMSG_MODE_DELETE.equals(navMode))
return typeManager.getDeletedPrivateMessageType();
else if (PVTMSG_MODE_DRAFT.equalsIgnoreCase(navMode))
return typeManager.getDraftPrivateMessageType();
else
return typeManager.getCustomTopicType(navMode);
}
//////// GETTER AND SETTER ///////////////////
public String processUpload(ValueChangeEvent event)
{
return DISPLAY_MESSAGES_PG ;
}
public String processUploadConfirm()
{
return DISPLAY_MESSAGES_PG;
}
public String processUploadCancel()
{
return DISPLAY_MESSAGES_PG ;
}
public void setForumManager(MessageForumsForumManager forumManager)
{
this.forumManager = forumManager;
}
public PrivateForum getForum()
{
return forum;
}
public void setForum(PrivateForum forum)
{
this.forum = forum;
}
// public String processActionAreaSettingEmailFwd()
// {
//
// }
/**
* Check String has value, not null
* @return boolean
*/
protected boolean hasValue(String eval)
{
if (eval != null && !"".equals(eval.trim()))
{
return true;
}
else
{
return false;
}
}
/**
* @param errorMsg
*/
private void setErrorMessage(String errorMsg)
{
LOG.debug("setErrorMessage(String " + errorMsg + ")");
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage(getResourceBundleString(ALERT) + ' ' + errorMsg));
}
private void setInformationMessage(String infoMsg)
{
LOG.debug("setInformationMessage(String " + infoMsg + ")");
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage(infoMsg));
}
/**
* Enable privacy message
* @return
*/
public boolean getRenderPrivacyAlert()
{
if(ServerConfigurationService.getString(MESSAGECENTER_PRIVACY_TEXT)!=null &&
ServerConfigurationService.getString(MESSAGECENTER_PRIVACY_TEXT).trim().length()>0 )
{
return true;
}
return false;
}
/**
* Get Privacy message link from sakai.properties
* @return
*/
public String getPrivacyAlertUrl()
{
return ServerConfigurationService.getString(MESSAGECENTER_PRIVACY_URL);
}
/**
* Get Privacy message from sakai.properties
* @return
*/
public String getPrivacyAlert()
{
return ServerConfigurationService.getString(MESSAGECENTER_PRIVACY_TEXT);
}
public boolean isAtMain(){
HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
String servletPath = req.getServletPath();
if (servletPath != null){
if (servletPath.startsWith("/jsp/main")){
return true;
}
}
return false;
}
public String getSortType() {
return sortType;
}
public void setSortType(String sortType) {
this.sortType = sortType;
}
public static String getResourceBundleString(String key)
{
return rb.getString(key);
}
public static String getResourceBundleString(String key, Object[] args) {
return rb.getFormattedMessage(key, args);
}
public String getAuthorString()
{
String authorString = getUserId();
try
{
User user = UserDirectoryService.getUser(getUserId());
if (ServerConfigurationService.getBoolean("msg.displayEid", true))
{
authorString = user.getSortName() + " (" + user.getDisplayId() + ")";
}
else
{
authorString = user.getSortName();
}
}
catch(Exception e)
{
e.printStackTrace();
}
return authorString;
}
public String getPlacementId()
{
return Validator.escapeJavascript("Main" + ToolManager.getCurrentPlacement().getId());
}
public boolean isSearchPvtMsgsEmpty()
{
return searchPvtMsgs == null || searchPvtMsgs.isEmpty();
}
public void setMsgNavMode(String msgNavMode) {
this.msgNavMode = msgNavMode;
}
/**
* @return
*/
public String processActionMarkCheckedAsRead()
{
return markCheckedMessages(true);
}
public String processActionMarkCheckedAsUnread() {
return markCheckedMessages(false);
}
public String processActionDeleteChecked() {
LOG.debug("processActionDeleteChecked()");
List pvtMsgList = getPvtMsgListToProcess();
boolean msgSelected = false;
selectedDeleteItems = new ArrayList();
Iterator pvtMsgListIter = pvtMsgList.iterator();
while (pvtMsgListIter.hasNext())
{
PrivateMessageDecoratedBean decoMessage = (PrivateMessageDecoratedBean) pvtMsgListIter.next();
if(decoMessage.getIsSelected())
{
msgSelected = true;
selectedDeleteItems.add(decoMessage);
}
}
if (!msgSelected)
{
setErrorMessage(getResourceBundleString(NO_MARKED_DELETE_MESSAGE));
return null;
}
return processPvtMsgMultiDelete();
}
public String processActionMoveCheckedToFolder() {
LOG.debug("processActionMoveCheckedToFolder()");
List pvtMsgList = getPvtMsgListToProcess();
boolean msgSelected = false;
selectedMoveToFolderItems = new ArrayList();
Iterator pvtMsgListIter = pvtMsgList.iterator();
while (pvtMsgListIter.hasNext())
{
PrivateMessageDecoratedBean decoMessage = (PrivateMessageDecoratedBean) pvtMsgListIter.next();
if(decoMessage.getIsSelected())
{
msgSelected = true;
selectedMoveToFolderItems.add(decoMessage);
}
}
if (!msgSelected)
{
setErrorMessage(getResourceBundleString(NO_MARKED_MOVE_MESSAGE));
return null;
}
moveToTopic = selectedTopicId;
return MOVE_MESSAGE_PG;
}
private List getPvtMsgListToProcess() {
List pvtMsgList = new ArrayList();
boolean searchMode = false;
// determine if we are looking at search results or the main listing
if (searchPvtMsgs != null && !searchPvtMsgs.isEmpty())
{
searchMode = true;
pvtMsgList = searchPvtMsgs;
}
else
{
pvtMsgList = decoratedPvtMsgs;
}
return pvtMsgList;
}
/**
*
* @param readStatus
* @return
*/
private String markCheckedMessages(boolean readStatus)
{
List pvtMsgList = getPvtMsgListToProcess();
boolean msgSelected = false;
boolean searchMode = false;
Iterator pvtMsgListIter = pvtMsgList.iterator();
while (pvtMsgListIter.hasNext())
{
PrivateMessageDecoratedBean decoMessage = (PrivateMessageDecoratedBean) pvtMsgListIter.next();
if(decoMessage.getIsSelected())
{
msgSelected = true;
if (readStatus) {
prtMsgManager.markMessageAsReadForUser(decoMessage.getMsg());
} else {
prtMsgManager.markMessageAsUnreadForUser(decoMessage.getMsg());
}
if (searchMode)
{
// Although the change was made in the db, the search
// view needs to be refreshed (it doesn't return to db)
decoMessage.setHasRead(true);
decoMessage.setIsSelected(false);
}
}
}
if (!msgSelected)
{
setErrorMessage(getResourceBundleString(NO_MARKED_READ_MESSAGE));
return null;
}
if (searchMode)
{
return SEARCH_RESULT_MESSAGES_PG;
}
return DISPLAY_MESSAGES_PG;
}
private void setFromMainOrHp()
{
String fromPage = getExternalParameterByKey(COMPOSE_FROM_PG);
if(fromPage != null && (fromPage.equals(MESSAGE_HOME_PG) || (fromPage.equals(MAIN_PG))))
{
fromMainOrHp = fromPage;
}
}
@SuppressWarnings("unchecked")
public String processActionPermissions()
{
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
ToolSession toolSession = SessionManager.getCurrentToolSession();
try {
String url = "../sakai.permissions.helper.helper/tool?" +
"session." + PermissionsHelper.DESCRIPTION + "=" +
org.sakaiproject.util.Web.escapeUrl(getResourceBundleString("pvt_properties_desc")) +
"&session." + PermissionsHelper.TARGET_REF + "=" +
SiteService.getSite(ToolManager.getCurrentPlacement().getContext()).getReference() +
"&session." + PermissionsHelper.PREFIX + "=" +
DefaultPermissionsManager.MESSAGE_FUNCTION_PREFIX + DefaultPermissionsManager.MESSAGE_FUNCITON_PREFIX_PERMISSIONS;
// Set permission descriptions
if (toolSession != null) {
ResourceLoader pRb = new ResourceLoader(PERMISSIONS_BUNDLE);
HashMap<String, String> pRbValues = new HashMap<String, String>();
for (Iterator<Entry<String, String>> iEntries = pRb.entrySet().iterator();iEntries.hasNext();)
{
Entry<String, String> entry = iEntries.next();
String key = entry.getKey();
pRbValues.put(key, entry.getValue());
}
toolSession.setAttribute("permissionDescriptions", pRbValues);
// set group awareness
String groupAware = ToolManager.getCurrentTool().getRegisteredConfig().getProperty("groupAware");
toolSession.setAttribute("groupAware", groupAware != null ? Boolean.valueOf(groupAware) : Boolean.FALSE);
}
// Invoke Permissions helper
context.redirect(url);
}
catch (IOException e) {
throw new RuntimeException("Failed to redirect to helper", e);
}catch (IdUnusedException e){
throw new RuntimeException("Failed to redirect to helper", e);
}
return null;
}
/**
* @return TRUE if within Messages & Forums tool, FALSE otherwise
*/
public boolean isMessagesandForums() {
return messageManager.currentToolMatch(MESSAGECENTER_TOOL_ID);
}
/**
* @return TRUE if within Messages tool, FALSE otherwise
*/
public boolean isMessages() {
return messageManager.currentToolMatch(MESSAGES_TOOL_ID);
}
/**
* @return TRUE if Message Forums (Message Center) exists in this site,
* FALSE otherwise
*/
public boolean isMessageForumsPageInSite() {
return isMessageForumsPageInSite(getSiteId());
}
/**
* @return TRUE if Messages & Forums (Message Center) exists in this site,
* FALSE otherwise
*/
private boolean isMessageForumsPageInSite(String siteId) {
return messageManager.isToolInSite(siteId, MESSAGECENTER_TOOL_ID);
}
/**
* @return TRUE if Messages tool exists in this site,
* FALSE otherwise
*/
public boolean isMessagesPageInSite() {
return isMessagesPageInSite(getSiteId());
}
/**
* @return TRUE if Messages tool exists in this site,
* FALSE otherwise
*/
private boolean isMessagesPageInSite(String siteId) {
return messageManager.isToolInSite(siteId, MESSAGES_TOOL_ID);
}
private String getEventMessage(Object object) {
String eventMessagePrefix = "";
final String toolId = ToolManager.getCurrentTool().getId();
if (toolId.equals(DiscussionForumService.MESSAGE_CENTER_ID))
eventMessagePrefix = "/messages&Forums/site/";
else if (toolId.equals(DiscussionForumService.MESSAGES_TOOL_ID))
eventMessagePrefix = "/messages/site/";
else
eventMessagePrefix = "/forums/site/";
return eventMessagePrefix + ToolManager.getCurrentPlacement().getContext() +
"/" + object.toString() + "/" + SessionManager.getCurrentSessionUserId();
}
public void setContentHostingService(ContentHostingService contentHostingService) {
this.contentHostingService = contentHostingService;
}
public SynopticMsgcntrManager getSynopticMsgcntrManager() {
return synopticMsgcntrManager;
}
public void setSynopticMsgcntrManager(
SynopticMsgcntrManager synopticMsgcntrManager) {
this.synopticMsgcntrManager = synopticMsgcntrManager;
}
public void setUserPreferencesManager(UserPreferencesManager userPreferencesManager) {
this.userPreferencesManager = userPreferencesManager;
}
public String getMobileSession()
{
Session session = SessionManager.getCurrentSession();
String rv = session.getAttribute("is_wireless_device") != null && ((Boolean) session.getAttribute("is_wireless_device")).booleanValue()?"true":"false";
return rv;
}
public boolean getCurrentSiteHasGroups(){
Site currentSite = getCurrentSite();
if(currentSite != null){
return currentSite.hasGroups();
}else{
return false;
}
}
public Site getCurrentSite(){
try{
return SiteService.getSite(ToolManager.getCurrentPlacement().getContext());
} catch (IdUnusedException e) {
LOG.error(e);
}
return null;
}
public List<SelectItem> getNonHiddenGroups(){
nonHiddenGroups = new ArrayList<SelectItem>();
nonHiddenGroups.add(new SelectItem(DEFAULT_NON_HIDDEN_GROUP_ID, getResourceBundleString(DEFAULT_NON_HIDDEN_GROUP_TITLE)));
Site currentSite = getCurrentSite();
if(currentSite.hasGroups()){
Collection groups = currentSite.getGroups();
groups = sortGroups(groups);
for (Iterator groupIterator = groups.iterator(); groupIterator.hasNext();)
{
Group currentGroup = (Group) groupIterator.next();
if(!isGroupHidden(currentGroup.getTitle())){
nonHiddenGroups.add(new SelectItem(currentGroup.getTitle(), currentGroup.getTitle()));
}
}
}
return nonHiddenGroups;
}
private boolean isGroupHidden(String groupName){
for (HiddenGroup hiddenGroup : getHiddenGroups()) {
if(hiddenGroup.getGroupId().equals(groupName)){
return true;
}
}
return false;
}
public List<HiddenGroup> getHiddenGroups(){
return hiddenGroups;
}
public void setHiddenGroups(List<HiddenGroup> hiddenGroups){
this.hiddenGroups = hiddenGroups;
}
/**
* Takes groups defined and sorts them alphabetically by title
* so will be in some order when displayed on permission widget.
*
* @param groups
* Collection of groups to be sorted
*
* @return
* Collection of groups in sorted order
*/
private Collection sortGroups(Collection groups) {
List sortGroupsList = new ArrayList();
sortGroupsList.addAll(groups);
final GroupComparator groupComparator = new GroupComparator("title", true);
Collections.sort(sortGroupsList, groupComparator);
groups.clear();
groups.addAll(sortGroupsList);
return groups;
}
public String getSelectedNonHiddenGroup(){
return selectedNonHiddenGroup;
}
public void setSelectedNonHiddenGroup(String selectedNonHiddenGroup){
this.selectedNonHiddenGroup = selectedNonHiddenGroup;
}
public void processActionAddHiddenGroup(ValueChangeEvent event){
String selectedGroup = (String) event.getNewValue();
if(!DEFAULT_NON_HIDDEN_GROUP_ID.equals(selectedGroup) && !isGroupHidden(selectedGroup)){
getHiddenGroups().add(new HiddenGroupImpl(selectedGroup));
selectedNonHiddenGroup = DEFAULT_NON_HIDDEN_GROUP_ID;
}
}
public String processActionRemoveHiddenGroup(){
String groupId = getExternalParameterByKey(PARAM_GROUP_ID);
if(groupId != null && !"".equals(PARAM_GROUP_ID)){
for (HiddenGroup hiddenGroup : getHiddenGroups()) {
if(hiddenGroup.getGroupId().equals(groupId)){
getHiddenGroups().remove(hiddenGroup);
break;
}
}
}
return null;
}
public Locale getUserLocale(){
return new ResourceLoader().getLocale();
}
private LRS_Statement getStatementForUserReadPvtMsg(LRS_Actor student, String subject) {
String url = ServerConfigurationService.getPortalUrl();
LRS_Verb verb = new LRS_Verb(SAKAI_VERB.interacted);
LRS_Object lrsObject = new LRS_Object(url + "/privateMessage", "read-private-message");
HashMap<String, String> nameMap = new HashMap<String, String>();
nameMap.put("en-US", "User read a private message");
lrsObject.setActivityName(nameMap);
HashMap<String, String> descMap = new HashMap<String, String>();
descMap.put("en-US", "User read a private message with subject: " + subject);
lrsObject.setDescription(descMap);
return new LRS_Statement(student, verb, lrsObject);
}
private LRS_Statement getStatementForUserSentPvtMsg(LRS_Actor student, String subject, SAKAI_VERB sakaiVerb) {
String url = ServerConfigurationService.getPortalUrl();
LRS_Verb verb = new LRS_Verb(sakaiVerb);
LRS_Object lrsObject = new LRS_Object(url + "/privateMessage", "send-private-message");
HashMap<String, String> nameMap = new HashMap<String, String>();
nameMap.put("en-US", "User sent a private message");
lrsObject.setActivityName(nameMap);
HashMap<String, String> descMap = new HashMap<String, String>();
descMap.put("en-US", "User sent a private message with subject: " + subject);
lrsObject.setDescription(descMap);
return new LRS_Statement(student, verb, lrsObject);
}
}