/**
* Copyright © 2002 Instituto Superior Técnico
*
* This file is part of FenixEdu Academic.
*
* FenixEdu Academic is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* FenixEdu Academic 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with FenixEdu Academic. If not, see <http://www.gnu.org/licenses/>.
*/
/**
*
*/
package org.fenixedu.academic.ui.struts.action.messaging;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.util.MessageResources;
import org.fenixedu.academic.domain.Person;
import org.fenixedu.academic.domain.exceptions.DomainException;
import org.fenixedu.academic.domain.messaging.ConversationMessage;
import org.fenixedu.academic.domain.messaging.ConversationThread;
import org.fenixedu.academic.domain.messaging.Forum;
import org.fenixedu.academic.dto.messaging.CreateConversationMessageBean;
import org.fenixedu.academic.dto.messaging.CreateConversationThreadAndMessageBean;
import org.fenixedu.academic.service.services.exceptions.FenixServiceException;
import org.fenixedu.academic.service.services.messaging.AddForumEmailSubscriber;
import org.fenixedu.academic.service.services.messaging.CreateConversationMessage;
import org.fenixedu.academic.service.services.messaging.CreateConversationThreadAndMessage;
import org.fenixedu.academic.service.services.messaging.RemoveForumEmailSubscriber;
import org.fenixedu.academic.ui.struts.action.base.FenixDispatchAction;
import org.fenixedu.academic.ui.struts.action.utils.RequestUtils;
import org.fenixedu.academic.util.MultiLanguageString;
import org.fenixedu.bennu.core.security.Authenticate;
import pt.ist.fenixWebFramework.renderers.utils.RenderUtils;
import pt.ist.fenixframework.FenixFramework;
/**
* @author <a href="mailto:goncalo@ist.utl.pt"> Goncalo Luiz</a><br>
* Created on May 5, 2006, 10:42:00 AM
*
* @author pcma
*/
public abstract class ForunsManagement extends FenixDispatchAction {
private static final Integer DEFAULT_PAGE_SIZE = 20;
public ActionForward viewForum(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws FenixServiceException {
prepareViewForum(request);
return mapping.findForward("viewForum");
}
public ActionForward prepareCreateThreadAndMessage(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws FenixServiceException {
request.setAttribute("forum", getRequestedForum(request));
request.setAttribute("person", getLoggedPerson(request));
return mapping.findForward("createThreadAndMessage");
}
public ActionForward createThreadAndMessage(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws FenixServiceException {
CreateConversationThreadAndMessageBean createConversationThreadAndMessageBean =
(CreateConversationThreadAndMessageBean) RenderUtils.getViewState("createThreadAndMessage").getMetaObject()
.getObject();
try {
CreateConversationThreadAndMessage.runCreateConversationThreadAndMessage(createConversationThreadAndMessageBean);
} catch (DomainException e) {
ActionMessages actionMessages = new ActionMessages();
actionMessages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(e.getKey()));
saveMessages(request, actionMessages);
return prepareCreateThreadAndMessage(mapping, form, request, response);
}
return this.viewForum(mapping, form, request, response);
}
private ActionForward viewThreadOnPage(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response, Integer pageNumber) throws FenixServiceException {
ConversationThread thread = this.getRequestedThread(request);
request.setAttribute("thread", thread);
request.setAttribute("pageNumber", pageNumber);
request.setAttribute("pageNumbers", computeNumberOfPages(DEFAULT_PAGE_SIZE, thread.getMessageSet().size()));
request.setAttribute("messages", getContentToDisplay(thread.getMessageSet(), pageNumber, DEFAULT_PAGE_SIZE));
Person loggedPerson = getLoggedPerson(request);
request.setAttribute("person", loggedPerson);
Forum forum = getRequestedForum(request);
request.setAttribute("forum", this.getRequestedForum(request));
request.setAttribute("loggedPersonCanWrite", forum.getWritersGroup().isMember(Authenticate.getUser()));
request.setAttribute("showReplyBox", this.getShowReplyBox(request));
return mapping.findForward("viewThread");
}
public ActionForward viewThread(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws FenixServiceException, IOException {
if (getLoggedPerson(request) == null) {
RequestUtils.sendLoginRedirect(request, response);
return null;
}
return viewThreadOnPage(mapping, actionForm, request, response, getPageNumber(request));
}
public ActionForward prepareCreateMessage(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws FenixServiceException {
request.setAttribute("quotationText", getQuotationText(request));
return viewThreadOnPage(mapping, actionForm, request, response,
computeNumberOfPages(DEFAULT_PAGE_SIZE, getRequestedThread(request).getMessageSet().size()));
}
public ActionForward createMessage(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request,
HttpServletResponse response) throws FenixServiceException {
CreateConversationMessageBean createConversationMessageBean =
(CreateConversationMessageBean) RenderUtils.getViewState("createMessage").getMetaObject().getObject();
try {
CreateConversationMessage.runCreateConversationMessage(createConversationMessageBean);
} catch (DomainException e) {
ActionMessages actionMessages = new ActionMessages();
actionMessages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(e.getKey()));
saveMessages(request, actionMessages);
return prepareCreateMessage(mapping, actionForm, request, response);
}
return viewThreadOnPage(mapping, actionForm, request, response,
computeNumberOfPages(DEFAULT_PAGE_SIZE, getRequestedThread(request).getMessageSet().size()));
}
public ActionForward emailSubscribe(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws FenixServiceException {
AddForumEmailSubscriber.run(getRequestedForum(request), getLoggedPerson(request));
prepareViewForum(request);
return mapping.findForward("viewForum");
}
public ActionForward emailUnsubscribe(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws FenixServiceException {
RemoveForumEmailSubscriber.run(getRequestedForum(request), getLoggedPerson(request));
prepareViewForum(request);
return mapping.findForward("viewForum");
}
protected String getQuotedMessageId(HttpServletRequest request) {
return request.getParameter("quoteMessageId");
}
protected Integer getPageNumber(HttpServletRequest request) {
String pageNumberString = request.getParameter("pageNumber");
return (pageNumberString != null) ? Integer.valueOf(pageNumberString) : 1;
}
protected Boolean getShowReplyBox(HttpServletRequest request) {
return Boolean.valueOf(request.getParameter("showReplyBox"));
}
protected ConversationThread getRequestedThread(HttpServletRequest request) {
return (ConversationThread) FenixFramework.getDomainObject(request.getParameter("threadId"));
}
protected Forum getRequestedForum(HttpServletRequest request) {
return (Forum) FenixFramework.getDomainObject(request.getParameter("forumId"));
}
private <T extends Comparable<T>> List<T> getContentToDisplay(Collection<T> messages, Integer pageNumber, Integer pageSize) {
List<T> nodeCopy = new ArrayList<T>(messages);
Collections.sort(nodeCopy);
int start = (pageNumber - 1) * pageSize;
return nodeCopy.subList(start, Math.min(nodeCopy.size(), start + pageSize));
}
private int computeNumberOfPages(Integer pageSize, int listSize) {
int totalPages = (int) StrictMath.ceil(listSize / Double.valueOf(pageSize));
return totalPages;
}
private MultiLanguageString getQuotationText(HttpServletRequest request) {
String quotedMessageId = this.getQuotedMessageId(request);
String quotationText = null;
if (quotedMessageId != null) {
MessageResources resources = this.getResources(request, "MESSAGING_RESOURCES");
ConversationMessage message = (ConversationMessage) FenixFramework.getDomainObject(quotedMessageId);
String author = message.getCreator().getName() + " (" + message.getCreator().getUsername() + ")";
quotationText =
resources.getMessage(this.getLocale(request), "messaging.viewThread.quotationText", author, message.getBody()
.getContent());
}
return new MultiLanguageString(quotationText);
}
private void prepareViewForum(HttpServletRequest request) throws FenixServiceException {
Forum forum = this.getRequestedForum(request);
request.setAttribute("forum", forum);
Integer pageNumber = getPageNumber(request);
request.setAttribute("pageNumber", pageNumber);
request.setAttribute("conversationThreads",
getContentToDisplay(forum.getConversationThreadSet(), pageNumber, DEFAULT_PAGE_SIZE));
request.setAttribute("pageNumbers", computeNumberOfPages(DEFAULT_PAGE_SIZE, forum.getConversationThreadSet().size()));
Person loggedPerson = getLoggedPerson(request);
request.setAttribute("receivingMessagesByEmail", forum.isPersonReceivingMessagesByEmail(loggedPerson));
request.setAttribute("loggedPersonCanWrite", forum.getWritersGroup().isMember(Authenticate.getUser()));
}
}