/** * 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.util.Date; import java.util.HashMap; import java.util.Map; import javax.portlet.PortletRequest; import javax.portlet.PortletSession; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import br.gov.camara.edemocracia.portlets.chat.NoSuchChatRoomUserException; 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; public class ChatPortletSessionUtil { private static final Log LOG = LogFactoryUtil.getLog(ChatPortletSessionUtil.class); public static void removeUserFromRoomAndSession(PortletRequest request, long chatRoomId) { UserActivityId userActivityId = removeUserFromSession(request, chatRoomId); if (userActivityId != null) { try { ChatRoomServiceUtil.removeChatUser(chatRoomId, userActivityId, new Date()); } catch(NoSuchChatRoomUserException ignore) { //Ignorar - Caso onde o usuário se logou em dois browsers diferentes } catch (Exception ignore) { LOG.warn("Erro ao remover usuário ", ignore); } } } /** * Recupera o {@link UserActivityId} da sessão e confirma se o dono deste id ainda está na sala, * seja espiando ou como um usuário participante do bate-papo. Se o id estiver na sessão e não estiver * na sala, limpa da sessão o id * @param request * @param chatRoomId * @return {@link UserActivityId} validado, ou null, caso tenha sido encontrada alguma inconsistência ( * que pode ocorrer após usuários serem removidos do bate-papo por inatividade) */ public static UserActivityId getValidatedUserActivityIdInRoom(PortletRequest request, Long chatRoomId) { if (chatRoomId == null) { return null; } UserActivityId idFromSession = getUserActivityIdInRoom(request, chatRoomId); if (idFromSession != null && !ChatRoomLocalServiceUtil.isUserInRoom(chatRoomId, idFromSession)) { removeUserFromSession(request, chatRoomId); return null; } return idFromSession; } @SuppressWarnings("unchecked") private static UserActivityId removeUserFromSession(PortletRequest request, Long chatRoomId) { PortletSession session = request.getPortletSession(); Map<Long, UserActivityId> roomsMap = (Map<Long, UserActivityId>) session.getAttribute(ChatPortletConstants.LOGGED_ROOMS_ATTRIBUTE, PortletSession.APPLICATION_SCOPE); if (roomsMap != null) { return roomsMap.remove(chatRoomId); } return null; } @SuppressWarnings("unchecked") public static UserActivityId getUserActivityIdInRoom(PortletRequest request, Long chatRoomId) { PortletSession session = request.getPortletSession(); Map<Long, UserActivityId> roomsMap = (Map<Long, UserActivityId>) session.getAttribute(ChatPortletConstants.LOGGED_ROOMS_ATTRIBUTE, PortletSession.APPLICATION_SCOPE); if (roomsMap == null) { return null; } return roomsMap.get(chatRoomId); } @SuppressWarnings("unchecked") public static void addUserToSession(PortletRequest request, long roomId, UserActivityId userActivityId) { PortletSession session = request.getPortletSession(); Map<Long, UserActivityId> roomsMap = (Map<Long, UserActivityId>) session.getAttribute(ChatPortletConstants.LOGGED_ROOMS_ATTRIBUTE, PortletSession.APPLICATION_SCOPE); if (roomsMap == null) { roomsMap = new HashMap<Long, UserActivityId>(); session.setAttribute(ChatPortletConstants.LOGGED_ROOMS_ATTRIBUTE, roomsMap, PortletSession.APPLICATION_SCOPE); } roomsMap.put(roomId, userActivityId); } }