package com.proudcase.managedbean; import com.google.code.morphia.Key; import com.proudcase.constants.Constants; import com.proudcase.filehandling.PropertyReader; import com.proudcase.mongodb.manager.FriendInvitationManager; import com.proudcase.mongodb.manager.ManagerFactory; import com.proudcase.mongodb.manager.MessagesManager; import com.proudcase.mongodb.manager.UserManager; import com.proudcase.persistence.FriendInvitationBean; import com.proudcase.persistence.MessagesBean; import com.proudcase.persistence.UserBean; import com.proudcase.view.MessagesCenterViewBean; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; import javax.faces.application.FacesMessage; import javax.faces.bean.ManagedBean; import javax.faces.bean.ManagedProperty; import javax.faces.bean.SessionScoped; import javax.faces.context.FacesContext; import org.bson.types.ObjectId; /** * Copyright © 03.07.2013 Michel Vocks This file is part of proudcase. * * proudcase is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * proudcase is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * proudcase. If not, see <http://www.gnu.org/licenses/>. * * / * ** * @Author: Michel Vocks * * @Date: 03.07.2013 * * @Encoding: UTF-8 */ @ManagedBean @SessionScoped public class MessagesCenterBean { @ManagedProperty(value = "#{sessionBean}") private SessionBean sessionBean; private final transient MessagesManager messagesManager = ManagerFactory.createMessagesManager(); private final transient FriendInvitationManager friendInvitationManager = ManagerFactory.createFriendInvitationManager(); private final transient UserManager userManager = ManagerFactory.createUserManager(); private List<MessagesCenterViewBean> messagesList = new ArrayList<>(); private int newMessages = 0; private UserBean receiver; private MessagesBean newMessage = new MessagesBean(); // sender name if not exists private static final String PROUDCASE_SENDER_NAME = "Proudcase"; public void init() { // Get the informations from the user FacesContext fCtx = FacesContext.getCurrentInstance(); UserBean loggedUser = (UserBean) fCtx.getExternalContext().getSessionMap().get(Constants.AUTH_KEY); // wrong user? leave if (loggedUser == null || loggedUser.getId() == null) { return; } // retrieve all messages List<MessagesBean> messagesListDB = messagesManager.getAllMessagesForUser(loggedUser); // retrieve all invitations List<FriendInvitationBean> friendInvitationsList = friendInvitationManager.getAllFriendInvitationsForUser(loggedUser); // empty lists if (messagesListDB.isEmpty() && friendInvitationsList.isEmpty()) { return; } // iterate through all messages for (MessagesBean singleMessage : messagesListDB) { // check for update boolean skipThisMessage = false; for (MessagesCenterViewBean singleViewMessage : messagesList) { if (singleViewMessage.getMessageid().equals(singleMessage.getId())) { // check for already read if (!singleViewMessage.isReached() && singleMessage.isReached()) { singleViewMessage.setReached(true); // decrease our new messages counter if (newMessages > 0) { newMessages--; } } // skip this skipThisMessage = true; break; } } // we have to skip if (skipThisMessage) { continue; } // create a new view object for our list and fill it MessagesCenterViewBean tempView = new MessagesCenterViewBean(); tempView.setMessageid(singleMessage.getId()); tempView.setMessage(singleMessage.getMessage()); tempView.setSenddate(singleMessage.getSenddate()); tempView.setReached(singleMessage.isReached()); tempView.setSendDateToString(getConvertedTime(singleMessage.getSenddate())); tempView.setInvitationMessage(false); // is this message a new one? if (!singleMessage.isReached()) { // add one to our counter newMessages++; } // check if the sender is not null if (singleMessage.getSender() != null) { // set the avatarhash tempView.setAvatar(singleMessage.getSender().getAvatar()); // now get the nickname for the user tempView.setNickname(singleMessage.getSender().toString()); } else { // we have no sender - so the sender is proudcase! tempView.setNickname(PROUDCASE_SENDER_NAME); } // finally, add that view obj to our list messagesList.add(tempView); } // iterate through all invitations for (FriendInvitationBean singleInvitation : friendInvitationsList) { // check for update boolean skipThisInvitation = false; for (MessagesCenterViewBean singleViewMessage : messagesList) { if (singleViewMessage.getMessageid().equals(singleInvitation.getId())) { // skip this skipThisInvitation = true; break; } } // we have to skip if (skipThisInvitation) { continue; } // create a new view object for our list and fill it MessagesCenterViewBean tempView = new MessagesCenterViewBean(); tempView.setMessageid(singleInvitation.getId()); tempView.setMessage(singleInvitation.getInvitationText()); tempView.setSenddate(singleInvitation.getInvitationDate()); tempView.setReached(false); tempView.setSendDateToString(getConvertedTime(singleInvitation.getInvitationDate())); tempView.setInvitationMessage(true); // add one to our counter newMessages++; // set the avatarhash tempView.setAvatar(singleInvitation.getUserSendInvitation().getAvatar()); // now get the nickname for the user tempView.setNickname(singleInvitation.getUserSendInvitation().toString()); // finally, add that view obj to our list messagesList.add(tempView); } // sort our list (new messages up) Collections.sort(messagesList); } public boolean isResetReachedMessages() { // Get the informations from the user FacesContext fCtx = FacesContext.getCurrentInstance(); UserBean loggedUser = (UserBean) fCtx.getExternalContext().getSessionMap().get(Constants.AUTH_KEY); // wrong user? leave if (loggedUser == null || loggedUser.getId() == null) { return false; } // reset our counter newMessages = 0; // retrieve all messages List<MessagesBean> messagesListDB = messagesManager.getAllMessagesForUser(loggedUser); // empty list if (messagesListDB == null || messagesListDB.isEmpty()) { return true; } // iterate through all messages for (MessagesBean singleMessage : messagesListDB) { // mark every message now as reached (read) setMessageAsReached(singleMessage); } return true; } public void sendMessage() { // Get the informations from the user FacesContext fCtx = FacesContext.getCurrentInstance(); UserBean loggedUser = (UserBean) fCtx.getExternalContext().getSessionMap().get(Constants.AUTH_KEY); // wrong user? leave if (loggedUser == null || loggedUser.getId() == null) { return; } // no receiver was choosen String label; if (receiver == null) { label = PropertyReader.getMessageResourceString( fCtx.getApplication().getMessageBundle(), "noreceiverselected", null, sessionBean.getUserLocale()); FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, label, label); FacesContext.getCurrentInstance().addMessage(null, message); return; } // set the sender newMessage.setSender(loggedUser); // set the receiver newMessage.setReceiver(receiver); // set the senddate newMessage.setSenddate(new Date()); // insert the message in the db Key<MessagesBean> save = messagesManager.save(newMessage); // reset the old stuff newMessage = new MessagesBean(); receiver = null; if (save != null && save.getId() != null) { // add the success message to the context label = PropertyReader.getMessageResourceString( fCtx.getApplication().getMessageBundle(), "msg_was_sended", null, sessionBean.getUserLocale()); FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, label, label); FacesContext.getCurrentInstance().addMessage(null, message); } else { // add error message label = PropertyReader.getMessageResourceString( fCtx.getApplication().getMessageBundle(), "error_db_connection", null, sessionBean.getUserLocale()); FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, label, label); FacesContext.getCurrentInstance().addMessage(null, message); } } // set this message as read private void setMessageAsReached(MessagesBean singleMessage) { // is this message already marked as reached? if (!singleMessage.isReached()) { // set as reached (read) singleMessage.setReached(true); // update the message boolean result = messagesManager.updateMessageReachedFlag(singleMessage); // db error if (!result) { // TODO: log that shit! } } } public void acceptInvitation(ObjectId invitationID) { // Get the informations from the user FacesContext fCtx = FacesContext.getCurrentInstance(); UserBean loggedUser = (UserBean) fCtx.getExternalContext().getSessionMap().get(Constants.AUTH_KEY); // wrong user? leave if (loggedUser == null || loggedUser.getId() == null) { return; } // retrieve the invitation FriendInvitationBean invitation = friendInvitationManager.get(invitationID); // something wrong here if (invitation == null) { return; } // add the relations on both sides boolean firstSuccess = userManager.addFriend(loggedUser, invitation.getUserSendInvitation()); boolean secondSuccess = userManager.addFriend(invitation.getUserSendInvitation(), loggedUser); // both true - nice! String label; if (firstSuccess && secondSuccess) { // add success message label = PropertyReader.getMessageResourceString( fCtx.getApplication().getMessageBundle(), "invitation_accept_done", null, sessionBean.getUserLocale()); FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, label, label); FacesContext.getCurrentInstance().addMessage(null, message); // also delete the invitation from the db friendInvitationManager.delete(invitation); // and from our message list MessagesCenterViewBean temp = null; for (MessagesCenterViewBean messagesCenterViewBean : messagesList) { if (invitation.getId().equals(messagesCenterViewBean.getMessageid())) { temp = messagesCenterViewBean; break; } } // delete it please :) if (temp != null) { messagesList.remove(temp); } } else { // add error message label = PropertyReader.getMessageResourceString( fCtx.getApplication().getMessageBundle(), "invitation_canceled_done", null, sessionBean.getUserLocale()); FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_FATAL, label, label); FacesContext.getCurrentInstance().addMessage(null, message); } } public void canceledInvitation(ObjectId invitationID) { // just delete the invitation from our database friendInvitationManager.deleteById(invitationID); // delete also from our list MessagesCenterViewBean temp = null; for (MessagesCenterViewBean messagesCenterViewBean : messagesList) { if (invitationID.equals(messagesCenterViewBean.getMessageid())) { temp = messagesCenterViewBean; break; } } // delete it please :) if (temp != null) { messagesList.remove(temp); } // add a message FacesContext fCtx = FacesContext.getCurrentInstance(); String label = PropertyReader.getMessageResourceString( fCtx.getApplication().getMessageBundle(), "invitation_canceled_done", null, sessionBean.getUserLocale()); FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN, label, label); FacesContext.getCurrentInstance().addMessage(null, message); } public void deleteMessage(ObjectId messageID) { // delete the message from our database messagesManager.deleteById(messageID); // delete also from our list MessagesCenterViewBean temp = null; for (MessagesCenterViewBean messagesCenterViewBean : messagesList) { if (messageID.equals(messagesCenterViewBean.getMessageid())) { temp = messagesCenterViewBean; break; } } // delete it please :) if (temp != null) { messagesList.remove(temp); } // add a message FacesContext fCtx = FacesContext.getCurrentInstance(); String label = PropertyReader.getMessageResourceString( fCtx.getApplication().getMessageBundle(), "message_delete_done", null, sessionBean.getUserLocale()); FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, label, label); FacesContext.getCurrentInstance().addMessage(null, message); } public String messageStatusText(MessagesCenterViewBean message) { // not null if (message == null) { return "ERROR"; } // get the text from the right status String statusText; FacesContext fCtx = FacesContext.getCurrentInstance(); if (message.isReached()) { statusText = PropertyReader.getMessageResourceString( fCtx.getApplication().getMessageBundle(), "old_msg", null, sessionBean.getUserLocale()); } else { statusText = PropertyReader.getMessageResourceString( fCtx.getApplication().getMessageBundle(), "new_msg", null, sessionBean.getUserLocale()); } // return the answer return statusText; } private String getConvertedTime(Date time) { SimpleDateFormat newFormat = new SimpleDateFormat( "EEEE, d. MMMM yyyy H:m", sessionBean.getUserLocale()); return newFormat.format(time); } public String returnNewMessagesCounted() { // call the init method to fetch our new messages init(); // return the number of new messages return String.valueOf(newMessages); } public MessagesBean getNewMessage() { return newMessage; } public void setNewMessage(MessagesBean newMessage) { this.newMessage = newMessage; } public List<MessagesCenterViewBean> getMessagesList() { return messagesList; } public void setMessagesList(List<MessagesCenterViewBean> messagesList) { this.messagesList = messagesList; } public UserBean getReceiver() { return receiver; } public void setReceiver(UserBean receiver) { this.receiver = receiver; } public SessionBean getSessionBean() { return sessionBean; } public void setSessionBean(SessionBean sessionBean) { this.sessionBean = sessionBean; } }