/**
* Copyright (c) 2009-2014 Câmara dos Deputados. Todos os direitos reservados.
*
* e-Democracia é um software livre; você pode redistribuí-lo e/ou modificá-lo dentro
* dos termos da Licença Pública Geral Menor GNU como publicada pela Fundação do
* Software Livre (FSF); na versão 2.1 da Licença, ou (na sua opinião) qualquer versão.
*
* Este programa é distribuído na esperança de que possa ser útil, mas SEM NENHUMA GARANTIA;
* sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou APLICAÇÃO EM PARTICULAR.
* Veja a Licença Pública Geral Menor GNU para maiores detalhes.
*/
package br.gov.camara.edemocracia.portlets.chat.portlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.TimeZone;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletException;
import javax.portlet.PortletPreferences;
import javax.portlet.PortletRequest;
import javax.portlet.PortletURL;
import javax.portlet.ProcessAction;
import javax.portlet.ReadOnlyException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;
import javax.portlet.ValidatorException;
import org.apache.commons.lang.StringUtils;
import br.gov.camara.edemocracia.portlets.chat.AccessDeniedException;
import br.gov.camara.edemocracia.portlets.chat.ChatRoomClosedException;
import br.gov.camara.edemocracia.portlets.chat.ChatRoomFullException;
import br.gov.camara.edemocracia.portlets.chat.NoSuchChatRoomException;
import br.gov.camara.edemocracia.portlets.chat.NoSuchChatRoomUserException;
import br.gov.camara.edemocracia.portlets.chat.UserBannedException;
import br.gov.camara.edemocracia.portlets.chat.UserNameAlreadyInUseException;
import br.gov.camara.edemocracia.portlets.chat.model.ChatRoom;
import br.gov.camara.edemocracia.portlets.chat.model.ChatRoomUser;
import br.gov.camara.edemocracia.portlets.chat.model.impl.MessageType;
import br.gov.camara.edemocracia.portlets.chat.model.impl.RoomStatus;
import br.gov.camara.edemocracia.portlets.chat.portlet.exporter.ChatRoomExporter;
import br.gov.camara.edemocracia.portlets.chat.portlet.exporter.ChatRoomExporterFactory;
import br.gov.camara.edemocracia.portlets.chat.portlet.views.AbstractView;
import br.gov.camara.edemocracia.portlets.chat.service.ChatRoomLocalServiceUtil;
import br.gov.camara.edemocracia.portlets.chat.service.ChatRoomServiceUtil;
import br.gov.camara.edemocracia.portlets.chat.service.UserActivityId;
import br.gov.camara.edemocracia.util.FlashScopeUtil;
import com.liferay.portal.NoSuchRegionException;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.portlet.LiferayPortlet;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.servlet.SessionMessages;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.model.Country;
import com.liferay.portal.model.LayoutConstants;
import com.liferay.portal.model.Region;
import com.liferay.portal.model.User;
import com.liferay.portal.service.CountryServiceUtil;
import com.liferay.portal.service.RegionServiceUtil;
import com.liferay.portal.theme.ThemeDisplay;
import com.liferay.portal.util.PortalUtil;
import com.liferay.portlet.PortletURLFactoryUtil;
public class ChatRoomPortlet extends LiferayPortlet {
private static final Log LOG = LogFactoryUtil.getLog(ChatRoomPortlet.class);
private static final String CD_CHAT_ROOM_COMPLETE_LIST_PORTLET_ID = "cdchatroomcompletelist_WAR_cdchatportlet";
@Override
protected final void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException {
ChatRoomView requestedView;
//
// Se informou a sala via parâmetro da página, entra diretamente na sala
// ou mostra a tela de cadastro
ThemeDisplay td = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);
User user = td.getUser();
UserActivityId userActivityId = null;
try {
// Procedimento padrão
// Verifica os pré-requisitos
String requestedViewParam = ParamUtil.getString(request, ChatPortletConstants.VIEW_PARAM, ChatRoomView.LIST.getUrlParamValue());
requestedView = ChatRoomView.fromUrlParamValue(requestedViewParam);
if (requestedView == null) {
LOG.warn("view inexistente: " + requestedViewParam);
requestedView = ChatRoomView.ERROR;
}
ChatRoom chatRoom = ChatPortletRequestUtil.getChatRoomFromRequest(request);
if (chatRoom != null) {
userActivityId = ChatPortletSessionUtil.getValidatedUserActivityIdInRoom(request, chatRoom.getRoomId());
}
requestedView = processRequest(request, response, requestedView, user, chatRoom, userActivityId);
} catch (PortalException e) {
LOG.info(ChatPortletConstants.ERRO_PREPARANDO_A_VIEW, e);
requestedView = ChatRoomView.ERROR;
} catch (SystemException e) {
LOG.info(ChatPortletConstants.ERRO_PREPARANDO_A_VIEW, e);
requestedView = ChatRoomView.ERROR;
}
getPortletContext().getRequestDispatcher(requestedView.getJspName()).include(request, response);
}
/**
* Processa a requisição
*
* @param request
* @param response
* @param requestedView
* @param user
* @param chatRoom
* @param chatRoomUser
* @return
* @throws PortalException
* @throws SystemException
*/
private ChatRoomView processRequest(RenderRequest request, RenderResponse response, ChatRoomView requestedView, User user, ChatRoom chatRoom,
UserActivityId userActivityId) throws PortalException, SystemException {
request.setAttribute(ChatPortletConstants.ROOM_ATTRIBUTE, chatRoom);
if (userActivityId != null) {
request.setAttribute(ChatPortletConstants.USER_ACTIVITY_ID_ATTRIBUTE, userActivityId);
}
// Usuário autenticado não pode entrar como anônimo
if (requestedView == ChatRoomView.ANON && !user.isDefaultUser()) {
requestedView = ChatRoomView.LIST;
}
if (requestedView == null) {
return ChatRoomView.ERROR;
}
HashSet<Class<? extends AbstractView>> classes = new HashSet<Class<? extends AbstractView>>();
AbstractView view = requestedView.createHandler();
do {
if (view == null) {
return ChatRoomView.ERROR;
}
if (classes.contains(view.getClass())) {
LOG.error("Processing loop");
return ChatRoomView.ERROR;
}
// Processa as classes
requestedView = view.process(request, response);
AbstractView newView = requestedView.createHandler();
// Teve redirecionamento?
if (newView.getClass().equals(view.getClass()))
break;
classes.add(view.getClass());
view = newView;
} while (true);
return requestedView;
}
@Override
protected final void doEdit(RenderRequest request, RenderResponse response) throws PortletException, IOException {
String editPage = getInitParameter("edit-jsp");
getPortletContext().getRequestDispatcher(editPage).include(request, response);
}
@ProcessAction(name = "savePortletPreferences")
public final void savePortletPreferences(ActionRequest req, ActionResponse rsp) throws PortalException, SystemException {
Boolean addThisUtilizarLinkParaSala = ParamUtil.getBoolean(req, "addthis_utilizar_link_para_sala");
String addThisTextoDescricao = ParamUtil.getString(req, "addthis_texto_descricao");
PortletPreferences prefs = req.getPreferences();
try {
prefs.setValue("addthis_texto_descricao", addThisTextoDescricao);
prefs.setValue("addthis_utilizar_link_para_sala", addThisUtilizarLinkParaSala.toString());
prefs.store();
SessionMessages.add(req, "success");
} catch (ReadOnlyException e) {
SessionErrors.add(req, "failure");
LOG.error("Ocorreu um erro ao salvar as preferências para o bate-papo.", e);
} catch (ValidatorException e) {
SessionErrors.add(req, "failure");
LOG.error("Ocorreu um erro ao salvar as preferências para o bate-papo.", e);
} catch (IOException e) {
SessionErrors.add(req, "failure");
LOG.error("Ocorreu um erro ao salvar as preferências para o bate-papo.", e);
}
}
/**
* A partir da lista de salas:
*
* Sala que permite anônimo: Se o usuário estiver logado, entra direto,
* autenticando Se o usuário não estiver logado, pede email, usuário e UF
*
* Sala que não permite anônimo Se o usuário estiver logado, entra direto Se
* o usuário não estiver logado, redireciono para login
*
* Espiar: Depende das permissões (SPY)
*
* @param req
* @param rsp
* @throws PortalException
* @throws SystemException
*/
@ProcessAction(name = "enterChatRoom")
public final void enterChatRoom(ActionRequest req, ActionResponse rsp) throws PortalException, SystemException {
User user = ChatPortletRequestUtil.getUserFromRequest(req);
long roomId = ParamUtil.get(req, ChatPortletConstants.ROOM_ID_PARAM, -1);
addPreviousPageLinkParameter(req, rsp);
if (user.isDefaultUser()) {
rsp.setRenderParameter(ChatPortletConstants.VIEW_PARAM, ChatRoomView.VIEW.getUrlParamValue());
rsp.setRenderParameter(ChatPortletConstants.ROOM_ID_PARAM, Long.toString(roomId));
return;
}
ChatPortletSessionUtil.removeUserFromRoomAndSession(req, roomId);
try {
ChatRoomUser chatRoomUser = ChatRoomServiceUtil.addChatUser(roomId, new Date());
ChatPortletSessionUtil.addUserToSession(req, roomId, UserActivityId.forPersistentUser(chatRoomUser.getChatUserId()));
} catch (NoSuchChatRoomException e) {
SessionErrors.add(req, "room-cant-find");
} catch (ChatRoomFullException e) {
SessionErrors.add(req, "user-must-join-audience");
} catch (ChatRoomClosedException e) {
rsp.setRenderParameter(ChatPortletConstants.VIEW_PARAM, ChatRoomView.DETAILS.getUrlParamValue());
rsp.setRenderParameter(ChatPortletConstants.ROOM_ID_PARAM, Long.toString(roomId));
return;
// SessionErrors.add(req, "room-closed");
} catch (UserBannedException e) {
SessionErrors.add(req, "user-banned");
} catch (AccessDeniedException e) {
SessionErrors.add(req, "no-access");
}
if (!SessionErrors.isEmpty(req)) {
rsp.setRenderParameter(ChatPortletConstants.VIEW_PARAM, ChatRoomView.LIST.getUrlParamValue());
rsp.setRenderParameter(ChatPortletConstants.ROOM_ID_PARAM, Long.toString(roomId));
return;
}
// Ok, adicionado na sala
rsp.setRenderParameter(ChatPortletConstants.ROOM_ID_PARAM, Long.toString(roomId));
rsp.setRenderParameter(ChatPortletConstants.VIEW_PARAM, ChatRoomView.VIEW.getUrlParamValue());
}
/**
* Entra na sala em modo "espião"
*
* @param req
* @param rsp
* @throws PortalException
* @throws SystemException
*/
@ProcessAction(name = "enterChatSpy")
public final void enterChatSpy(ActionRequest req, ActionResponse rsp) throws PortalException, SystemException {
User user = ChatPortletRequestUtil.getUserFromRequest(req);
long roomId = ParamUtil.get(req, ChatPortletConstants.ROOM_ID_PARAM, -1);
addPreviousPageLinkParameter(req, rsp);
// Remove a sessão antiga, caso o objeto esteja em sessão
ChatPortletSessionUtil.removeUserFromRoomAndSession(req, roomId);
try {
UserActivityId userActivityId = ChatRoomServiceUtil.addSpyUser(roomId, new Date());
ChatPortletSessionUtil.addUserToSession(req, roomId, userActivityId);
// Ok, adicionado na sala
rsp.setRenderParameter(ChatPortletConstants.VIEW_PARAM, ChatRoomView.VIEW.getUrlParamValue());
rsp.setRenderParameter(ChatPortletConstants.ROOM_ID_PARAM, Long.toString(roomId));
} catch (NoSuchChatRoomException e) {
SessionErrors.add(req, "room-cant-find");
if (user.isDefaultUser()) {
rsp.setRenderParameter(ChatPortletConstants.VIEW_PARAM, ChatRoomView.ERROR.getUrlParamValue());
} else {
rsp.setRenderParameter(ChatPortletConstants.VIEW_PARAM, ChatRoomView.LIST.getUrlParamValue());
}
return;
} catch (ChatRoomClosedException e) {
SessionErrors.add(req, "room-closed");
} catch (AccessDeniedException e) {
SessionErrors.add(req, "no-access");
} catch (ChatRoomFullException e) {
SessionErrors.add(req, "user-must-join-audience");
} catch (UserBannedException e) {
SessionErrors.add(req, "user-banned");
}
if (!SessionErrors.isEmpty(req)) {
if (user.isDefaultUser()) {
rsp.setRenderParameter(ChatPortletConstants.ROOM_ID_PARAM, Long.toString(roomId));
rsp.setRenderParameter(ChatPortletConstants.VIEW_PARAM, ChatRoomView.ANON.getUrlParamValue());
} else {
rsp.setRenderParameter(ChatPortletConstants.VIEW_PARAM, ChatRoomView.LIST.getUrlParamValue());
}
return;
}
}
/**
* Na validação das informações passadas pelo usuário anônimo, deve-se
* verificar não só se existe algum usuário na mesma sala com com mesmo
* apelido e email, mas também se já existe algum usuário no portal com
* mesmo full name e email, a fim de evitar duplicidade dentro da sala.
*
* @param req
* @param rsp
* @throws PortalException
* @throws SystemException
*/
@ProcessAction(name = "enterChatAnon")
public final void enterChatAnon(ActionRequest req, ActionResponse rsp) throws PortalException, SystemException {
User user = ChatPortletRequestUtil.getUserFromRequest(req);
if (!user.isDefaultUser()) {
enterChatRoom(req, rsp);
return;
}
addPreviousPageLinkParameter(req, rsp);
long roomId = ParamUtil.get(req, ChatPortletConstants.ROOM_ID_PARAM, -1);
// Acrescenta
String nome = ParamUtil.getString(req, "nome", "").trim();
if (nome.length() == 0) {
SessionErrors.add(req, "missing-name");
} else if (nome.length() > 75) {
SessionErrors.add(req, "name-too-long");
}
String email = ParamUtil.getString(req, ChatPortletConstants.EMAIL_PARAM, "").trim();
if (email.length() == 0) {
SessionErrors.add(req, "missing-email");
} else if (email.length() > 75) {
SessionErrors.add(req, "email-too-long");
} else if (!Validator.isEmailAddress(email)) {
SessionErrors.add(req, "invalid-email");
}
long uf = ParamUtil.getLong(req, ChatPortletConstants.REGION_ID_PARAM, 0l);
Country brasil = CountryServiceUtil.getCountryByA2("BR");
try {
Region region = RegionServiceUtil.getRegion(uf);
if (region.getCountryId() != brasil.getCountryId()) {
SessionErrors.add(req, "invalid-region");
}
} catch (NoSuchRegionException e) {
SessionErrors.add(req, "invalid-region");
}
if (!SessionErrors.isEmpty(req)) {
rsp.setRenderParameter(ChatPortletConstants.VIEW_PARAM, ChatRoomView.ANON.getUrlParamValue());
rsp.setRenderParameter(ChatPortletConstants.ROOM_ID_PARAM, Long.toString(roomId));
FlashScopeUtil.set(req, ChatPortletConstants.NICKNAME_PARAM, nome);
FlashScopeUtil.set(req, ChatPortletConstants.EMAIL_PARAM, email);
FlashScopeUtil.set(req, ChatPortletConstants.REGION_ID_PARAM, uf);
return;
}
try {
ChatPortletSessionUtil.removeUserFromRoomAndSession(req, roomId);
ChatRoomUser chatRoomUser = ChatRoomServiceUtil.addAnonUser(roomId, new Date(), nome, email, uf);
ChatPortletSessionUtil.addUserToSession(req, roomId, UserActivityId.forPersistentUser(chatRoomUser.getChatUserId()));
} catch (UserNameAlreadyInUseException e) {
SessionErrors.add(req, "name-already-exists-scope-room");
rsp.setRenderParameter(ChatPortletConstants.VIEW_PARAM, ChatRoomView.ANON.getUrlParamValue());
rsp.setRenderParameter(ChatPortletConstants.ROOM_ID_PARAM, Long.toString(roomId));
FlashScopeUtil.set(req, ChatPortletConstants.NICKNAME_PARAM, nome);
FlashScopeUtil.set(req, ChatPortletConstants.EMAIL_PARAM, email);
FlashScopeUtil.set(req, ChatPortletConstants.REGION_ID_PARAM, uf);
FlashScopeUtil.set(req, ChatPortletConstants.NAME_SUGGESTIONS, e.getSuggestions());
return;
} catch (NoSuchChatRoomException e) {
SessionErrors.add(req, "room-cant-find");
rsp.setRenderParameter(ChatPortletConstants.VIEW_PARAM, ChatRoomView.ERROR.getUrlParamValue());
return;
} catch (ChatRoomFullException e) {
SessionErrors.add(req, "user-must-join-audience");
} catch (ChatRoomClosedException e) {
SessionErrors.add(req, "room-closed");
} catch (UserBannedException e) {
SessionErrors.add(req, "user-banned");
} catch (AccessDeniedException e) {
SessionErrors.add(req, "no-access");
}
if (!SessionErrors.isEmpty(req)) {
rsp.setRenderParameter(ChatPortletConstants.ROOM_ID_PARAM, Long.toString(roomId));
rsp.setRenderParameter(ChatPortletConstants.VIEW_PARAM, ChatRoomView.ANON.getUrlParamValue());
return;
}
DateFormat df = new SimpleDateFormat(ChatPortletConstants.ISO_DATE_PATTERN);
df.setTimeZone(TimeZone.getTimeZone(ChatPortletConstants.GMT));
rsp.setRenderParameter(ChatPortletConstants.ROOM_ID_PARAM, Long.toString(roomId));
rsp.setRenderParameter(ChatPortletConstants.VIEW_PARAM, ChatRoomView.VIEW.getUrlParamValue());
}
@ProcessAction(name = "leaveChatRoom")
public final void leaveChatRoom(ActionRequest req, ActionResponse rsp) throws PortalException, SystemException, IOException {
Long chatRoomId = ParamUtil.getLong(req, ChatPortletConstants.ROOM_ID_PARAM);
UserActivityId userActivityIdFromRequest = UserActivityId.fromString(req.getParameter("userActivityId"));
UserActivityId userActivityIdFromSession = ChatPortletSessionUtil.getUserActivityIdInRoom(req, chatRoomId);
if (userActivityIdFromRequest != null && userActivityIdFromRequest.equals(userActivityIdFromSession)) {
if (userActivityIdFromSession.isPersistentUser()) {
ChatRoomUser chatRoomUser = ChatPortletRequestUtil.getChatRoomUser(req, chatRoomId);
if (chatRoomUser != null && chatRoomUser.isBanned()) {
SessionErrors.add(req, "user-banned");
}
}
ChatPortletSessionUtil.removeUserFromRoomAndSession(req, chatRoomId);
}
// Decide se redirecionará para a página de listagem de salas ou
// para a entrada de usuário anônimo
ThemeDisplay td = (ThemeDisplay) req.getAttribute(WebKeys.THEME_DISPLAY);
String previousPageLink = req.getParameter(ChatPortletConstants.PREVIOUS_PAGE_LINK);
boolean validPreviousPageLink = StringUtils.isNotBlank(previousPageLink) && ChatPortletRequestUtil.isUrlToSameHost(req, previousPageLink);
ChatRoom room = ChatRoomLocalServiceUtil.getChatRoom(chatRoomId);
if (room.getAnonymousAllowed() && td.getUser().isDefaultUser()) {
if (validPreviousPageLink) {
rsp.setRenderParameter(ChatPortletConstants.PREVIOUS_PAGE_LINK, previousPageLink);
}
rsp.setRenderParameter(ChatPortletConstants.ROOM_ID_PARAM, chatRoomId.toString());
rsp.setRenderParameter(ChatPortletConstants.VIEW_PARAM, ChatRoomView.ANON.getUrlParamValue());
} else {
if (validPreviousPageLink) {
rsp.sendRedirect(previousPageLink);
} else {
resolveListViewRedirectPage(req, rsp);
}
}
}
@ProcessAction(name = "viewHistory")
public final void viewHistory(ActionRequest req, ActionResponse rsp) throws PortalException, SystemException {
ChatRoom room = ChatPortletRequestUtil.getChatRoomFromRequest(req);
if (room == null) {
SessionErrors.add(req, "room-cant-find");
rsp.setRenderParameter(ChatPortletConstants.VIEW_PARAM, ChatRoomView.LIST.getUrlParamValue());
return;
}
if (room.getStatus() != RoomStatus.Exported.getValue()) {
SessionErrors.add(req, "room-not-exported");
rsp.setRenderParameter(ChatPortletConstants.VIEW_PARAM, ChatRoomView.LIST.getUrlParamValue());
return;
}
addPreviousPageLinkParameter(req, rsp);
rsp.setRenderParameter(ChatPortletConstants.VIEW_PARAM, ChatRoomView.HISTORY.getUrlParamValue());
rsp.setRenderParameter(ChatPortletConstants.ROOM_ID_PARAM, Long.toString(room.getRoomId()));
}
@ProcessAction(name = "listChatRooms")
public final void listChatRooms(ActionRequest req, ActionResponse rsp) throws PortalException, SystemException, IOException {
resolveListViewRedirectPage(req, rsp);
}
/**
* Verifica se a comunidade atual possui alguma página com o portlet de
* todas as comunidades. Se encontrar alguma, faz o redirect para a página.
* Se não encontrar envia para a página de listagem padrão onde são exibidas
* somente as salas da comunidade atual.
*
* @throws SystemException
* @throws PortalException
* @throws IOException
*
*/
private void resolveListViewRedirectPage(ActionRequest req, ActionResponse rsp) throws PortalException, SystemException, IOException {
ThemeDisplay td = (ThemeDisplay) req.getAttribute(WebKeys.THEME_DISPLAY);
long plid = PortalUtil.getPlidFromPortletId(td.getScopeGroupId(), CD_CHAT_ROOM_COMPLETE_LIST_PORTLET_ID);
if (plid != LayoutConstants.DEFAULT_PLID) {
PortletURL portletURL = PortletURLFactoryUtil.create(req, CD_CHAT_ROOM_COMPLETE_LIST_PORTLET_ID, plid, PortletRequest.ACTION_PHASE);
portletURL.setParameter("javax.portlet.action", "listChatRooms");
portletURL.setParameter("p_p_lifecycle", "1");
String url = portletURL.toString();
rsp.sendRedirect(url);
} else {
rsp.setRenderParameter(ChatPortletConstants.VIEW_PARAM, ChatRoomView.LIST.getUrlParamValue());
}
}
@Override
public final void serveResource(ResourceRequest request, ResourceResponse response) throws PortletException, IOException {
String id = request.getResourceID();
PrintWriter out = response.getWriter();
if (id.equalsIgnoreCase("cdchatupdate")) {
getAjaxChatUpdate(request, out);
} else if (id.equalsIgnoreCase("cdchatpostmsg")) {
postAjaxMessage(request, out);
} else if (id.equalsIgnoreCase("cdchatbanuser")) {
ajaxBanUser(request, out, true);
} else if (id.equalsIgnoreCase("cdchatunbanuser")) {
ajaxBanUser(request, out, false);
} else if (id.equalsIgnoreCase("cdchatapprovemsg")) {
ajaxApproveMsg(request, out, true);
} else if (id.equalsIgnoreCase("cdchatrejectmsg")) {
ajaxApproveMsg(request, out, false);
} else if (id.equalsIgnoreCase("cdchatopenroom")) {
ajaxOpenRoom(request, out);
} else if (id.equalsIgnoreCase("cdchatcloseroom")) {
ajaxCloseRoom(request, out);
} else if (id.equalsIgnoreCase("cdchatexport")) {
exportMessages(request, response);
}
}
private void addPreviousPageLinkParameter(PortletRequest req, ActionResponse rsp) {
String previousPageLink = ParamUtil.get(req, ChatPortletConstants.PREVIOUS_PAGE_LINK, "");
if (StringUtils.isNotBlank(previousPageLink)) {
rsp.setRenderParameter(ChatPortletConstants.PREVIOUS_PAGE_LINK, previousPageLink);
}
}
/**
* Aprova uma mensagem
*
* @param request
* @param out
* @param approved
*/
private void ajaxApproveMsg(ResourceRequest request, PrintWriter out, boolean approved) {
long roomId = ParamUtil.get(request, ChatPortletConstants.ROOM_ID_PARAM, -1);
long msgId = ParamUtil.getLong(request, "msgId", -1);
if (roomId != -1 && msgId != -1) {
try {
ChatRoomServiceUtil.approveMessage(roomId, msgId, approved, new Date());
out.print("{\"ok\" : true, \"id\" : " + msgId + "}");
} catch (PortalException e) {
out.print("{\"ok\" : false, \"id\" : " + msgId + "}");
} catch (SystemException e) {
LOG.error("Erro ao aprovar mensagem", e);
out.print("{\"ok\" : false, \"id\" : " + msgId + "}");
}
}
}
/**
* Bane um usuário
*
* @param request
* @param out
* @param banned
*/
private void ajaxBanUser(ResourceRequest request, PrintWriter out, boolean banned) {
long roomId = ParamUtil.get(request, ChatPortletConstants.ROOM_ID_PARAM, -1);
long userId = ParamUtil.getLong(request, "user", -1);
if (roomId != -1 && roomId != -1) {
try {
ChatRoomServiceUtil.banUser(roomId, userId, new Date(), banned);
out.print(ChatPortletConstants.OK);
} catch (PortalException e) {
out.print(ChatPortletConstants.ERROR);
} catch (SystemException e) {
LOG.error("Erro ao banir usuário", e);
out.print(ChatPortletConstants.ERROR);
}
}
}
/**
* Abre a sala de bate-papo
*
* @param request
* @param out
*/
private void ajaxOpenRoom(ResourceRequest request, PrintWriter out) {
long roomId = ParamUtil.get(request, ChatPortletConstants.ROOM_ID_PARAM, -1);
try {
ChatRoomServiceUtil.openChatRoom(roomId, new Date());
out.print(ChatPortletConstants.OK_TRUE);
} catch (PortalException e) {
out.print(ChatPortletConstants.OK_FALSE);
} catch (SystemException e) {
LOG.error("Erro ao banir usuário", e);
out.print(ChatPortletConstants.OK_FALSE);
}
}
/**
* Fecha a sala de bate-papo
*
* @param request
* @param out
*/
private void ajaxCloseRoom(ResourceRequest request, PrintWriter out) {
long roomId = ParamUtil.get(request, ChatPortletConstants.ROOM_ID_PARAM, -1);
try {
ChatRoomServiceUtil.closeChatRoom(roomId, new Date());
out.print(ChatPortletConstants.OK_TRUE);
} catch (PortalException e) {
out.print(ChatPortletConstants.OK_FALSE);
} catch (SystemException e) {
LOG.error("Erro ao banir usuário", e);
out.print(ChatPortletConstants.OK_FALSE);
}
}
private void getAjaxChatUpdate(ResourceRequest request, PrintWriter out) {
Date since;
DateFormat df = new SimpleDateFormat(ChatPortletConstants.ISO_DATE_PATTERN);
df.setTimeZone(TimeZone.getTimeZone(ChatPortletConstants.GMT));
String strSince = ParamUtil.getString(request, "chat_since");
try {
since = df.parse(strSince);
} catch (ParseException e) {
since = new Date();
LOG.error("Erro ao interpretar data");
}
long roomId = ParamUtil.getLong(request, ChatPortletConstants.ROOM_ID_PARAM);
boolean firstUpdate = ParamUtil.getBoolean(request, "first");
try {
UserActivityId userActivityId = UserActivityId.fromString(request.getParameter("chatUserId"));
String output = ChatRoomServiceUtil.getJSONUpdate(roomId, userActivityId, since, firstUpdate);
out.print(output);
} catch (NoSuchChatRoomUserException e) {
out.print("\"error: NoSuchChatRoomUserException\"");
} catch (NoSuchChatRoomException e) {
out.print("\"error: NoSuchChatRoomException\"");
LOG.error("Erro ao obter atualização das mensagens. Não existe sala de bate papo com a chave primária " + roomId);
LOG.debug("Erro ao obter atualização das mensagens. Não existe sala de bate papo com a chave primária " + roomId, e);
} catch (PortalException e) {
out.print("\"error: ");
out.print(e.getMessage());
out.print("\"");
LOG.error("Erro ao obter atualizacao das mensagens", e);
} catch (SystemException e) {
out.print("\"error: ");
out.print(e.getMessage());
out.print("\"");
LOG.error("Erro ao obter atualizacao das mensagens", e);
}
}
private void postAjaxMessage(ResourceRequest request, PrintWriter out) {
String msgText = ParamUtil.getString(request, "msgText");
boolean msgPublic = !ParamUtil.getBoolean(request, "priv", true);
long msgRecipient = ParamUtil.getLong(request, "user");
int textType = ParamUtil.getInteger(request, "textType", 0);
ChatRoomUser chatRoomUser = null;
ChatRoom chatRoom;
try {
chatRoom = ChatPortletRequestUtil.getChatRoomFromRequest(request);
if (chatRoom != null) {
chatRoomUser = ChatPortletRequestUtil.getChatRoomUser(request, chatRoom.getRoomId());
}
if (chatRoomUser == null) {
out.print("\"error: NoSuchChatRoomUserException\"");
return;
}
} catch (PortalException e) {
out.print("\"error: ");
out.print(e.getMessage());
out.print("\"");
LOG.error("Erro ao obter postar mensagens", e);
return;
} catch (SystemException e) {
out.print("\"error: ");
out.print(e.getMessage());
out.print("\"");
LOG.error("Erro ao obter postar mensagens", e);
return;
}
long userId = chatRoomUser.getChatUserId();
boolean msgAdmin = false;
try {
ChatPermissionChecker checker = new ChatPermissionChecker(chatRoom);
if (checker.isCanModerate()) {
msgAdmin = ParamUtil.getBoolean(request, "admin", false);
long sendAsId = ParamUtil.getLong(request, "sendAs", -1);
if (sendAsId != -1) {
userId = sendAsId;
}
}
// Se a mensagem for para todos, obrigatoriamente é pública
if (msgRecipient == -1)
msgPublic = true;
boolean canPost = (checker.isCanModerate() || checker.isOpen()) && !chatRoomUser.isBanned();
if (canPost && (msgText != null && msgText.trim().length() > 0)) {
Calendar cal = Calendar.getInstance();
DateFormat df = new SimpleDateFormat(ChatPortletConstants.ISO_DATE_PATTERN);
df.setTimeZone(TimeZone.getTimeZone(ChatPortletConstants.GMT));
cal.setTimeZone(TimeZone.getTimeZone(ChatPortletConstants.GMT));
LOG.debug(df.format(cal.getTime()));
ChatRoomServiceUtil.postMessage(MessageType.Standard, userId, chatRoom.getRoomId(), cal.getTime(), msgText, msgPublic, msgAdmin, msgRecipient,
textType);
out.print(ChatPortletConstants.OK);
} else {
out.print(ChatPortletConstants.OK);
}
} catch (PortalException e) {
out.print("fail");
LOG.error("Erro ao postar mensagem", e);
} catch (SystemException e) {
out.print("fail");
LOG.error("Erro ao postar mensagem", e);
}
}
private void exportMessages(ResourceRequest request, ResourceResponse response) throws IOException {
PrintWriter out = response.getWriter();
try {
long roomId = ParamUtil.getLong(request, ChatPortletConstants.ROOM_ID_PARAM, -1);
User user = ChatPortletRequestUtil.getUserFromRequest(request);
TimeZone tz = TimeZone.getDefault();
if (user != null) {
tz = user.getTimeZone();
}
String format = ParamUtil.getString(request, "format", "html");
ChatRoomExporter exporter = ChatRoomExporterFactory.create(format);
String exportedRoom = exporter.exportChatRoom(roomId, tz);
out.println(exportedRoom);
response.setProperty("Content-Disposition", "attachment;filename=\"" + exporter.getFilename(roomId) + "\"");
} catch (NumberFormatException nfe) {
LOG.error("Erro ao interpretar numero", nfe);
} catch (PortalException e) {
LOG.error("Erro ao exportar mensagens", e);
} catch (SystemException e) {
LOG.error("Erro ao exportar mensagens", e);
}
}
}