/** * 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.cancelamentoassinatura.bean; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Locale; import javax.faces.bean.ManagedBean; import javax.faces.bean.ViewScoped; import com.liferay.faces.portal.context.LiferayFacesContext; import br.gov.camara.edemocracia.portlets.cancelamentoassinatura.dto.Assinatura; import br.gov.camara.edemocracia.portlets.cancelamentoassinatura.dto.TipoAssinatura; import com.liferay.faces.portal.context.LiferayFacesContext; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.kernel.language.LanguageUtil; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.model.Group; import com.liferay.portal.model.GroupConstants; import com.liferay.portal.model.Subscription; import com.liferay.portal.service.GroupLocalServiceUtil; import com.liferay.portal.service.SubscriptionLocalServiceUtil; import com.liferay.portlet.announcements.model.AnnouncementsDelivery; import com.liferay.portlet.announcements.service.AnnouncementsDeliveryLocalServiceUtil; import com.liferay.portlet.messageboards.NoSuchCategoryException; import com.liferay.portlet.messageboards.model.MBCategory; import com.liferay.portlet.messageboards.model.MBMessage; import com.liferay.portlet.messageboards.model.MBThread; import com.liferay.portlet.messageboards.service.MBCategoryLocalServiceUtil; import com.liferay.portlet.messageboards.service.MBMessageLocalServiceUtil; import com.liferay.portlet.messageboards.service.MBThreadLocalServiceUtil; import com.liferay.portlet.wiki.model.WikiNode; import com.liferay.portlet.wiki.model.WikiPage; import com.liferay.portlet.wiki.service.WikiNodeLocalServiceUtil; import com.liferay.portlet.wiki.service.WikiPageLocalServiceUtil; /** * @author p_7339 * */ @ManagedBean(name = "assinaturasBean") @ViewScoped public class AssinaturasBean { private List<Assinatura> assinaturas; public List<Assinatura> getAssinaturas() { if (assinaturas != null) return assinaturas; long userId = LiferayFacesContext.getInstance().getUserId(); long companyId = LiferayFacesContext.getInstance().getCompanyId(); Locale locale = LiferayFacesContext.getInstance().getLocale(); assinaturas = new ArrayList<Assinatura>(); // Assinaturas de notificações - acrescenta-as à comunidade padrão try { Group comunidadeGuest = GroupLocalServiceUtil.getGroup(companyId, GroupConstants.GUEST); String nomeComunidadeGuest = comunidadeGuest.getDescriptiveName(); List<AnnouncementsDelivery> deliveries = AnnouncementsDeliveryLocalServiceUtil .getUserDeliveries(userId); for (AnnouncementsDelivery delivery : deliveries) { if (delivery.getEmail()) { Assinatura assinatura = new Assinatura(); assinatura.setComunidade(nomeComunidadeGuest); assinatura.setTipo(TipoAssinatura.ANUNCIO); assinatura.setIdentificador("n" + delivery.getType()); assinatura .setNome(LanguageUtil.get(locale, delivery.getType())); assinaturas.add(assinatura); } } } catch (PortalException e) { // TODO Log } catch (SystemException e) { throw new RuntimeException(e); } // Verifica onde o usuário está inscrito try { assinaturasCategoriaForum(userId, locale); assinaturasThreadForum(userId); assinaturasNoWiki(userId); assinaturasPaginaWiki(userId); } catch (SystemException e) { throw new RuntimeException(e); } Collections.sort(assinaturas, new Comparator<Assinatura>() { @Override public int compare(Assinatura o1, Assinatura o2) { if (o1.getComunidade() == null && o2.getComunidade() != null) return -1; else if (o1.getComunidade() != null && o2.getComunidade() == null) return 1; else if (o1.getComunidade() == o2.getComunidade() || o1.getComunidade().equalsIgnoreCase( o2.getComunidade())) { if (!o1.getTipo().equals(o2.getTipo())) return (o1.getTipo().compareTo(o2.getTipo())); return o1.getNome().compareToIgnoreCase(o2.getNome()); } else { // comunidades são != null e são diferentes entre si return o1.getComunidade().compareToIgnoreCase( o2.getComunidade()); } } }); return assinaturas; } /** * @param userId * @param locale * @throws SystemException * @throws PortalException */ private void assinaturasCategoriaForum(long userId, Locale locale) throws SystemException { // Categorias de Forum e forums de grupo List<Subscription> subscricoes = SubscriptionLocalServiceUtil .getUserSubscriptions(userId, MBCategory.class.getName()); for (Subscription subscricao : subscricoes) { try { MBCategory categoria = MBCategoryLocalServiceUtil .getCategory(subscricao.getClassPK()); Group grupo = GroupLocalServiceUtil.getGroup(categoria .getGroupId()); adicionaAssinatura(assinaturas, subscricao, TipoAssinatura.FORUM_CATEGORY, grupo, categoria.getDescription()); } catch (NoSuchCategoryException e) { try { Group grupo = GroupLocalServiceUtil.getGroup(subscricao .getClassPK()); adicionaAssinatura(assinaturas, subscricao, TipoAssinatura.FORUM_CATEGORY, grupo, LanguageUtil.get(locale, "community-forum")); } catch (PortalException e2) { // Ignore } } catch (PortalException e) { // Ignore } } } /** * @param userId * @throws SystemException */ private void assinaturasThreadForum(long userId) throws SystemException { List<Subscription> subscricoes; // Threads de forum subscricoes = SubscriptionLocalServiceUtil.getUserSubscriptions(userId, MBThread.class.getName()); for (Subscription subscricao : subscricoes) { try { MBThread thread = MBThreadLocalServiceUtil .getMBThread(subscricao.getClassPK()); MBMessage mensagemRaiz = MBMessageLocalServiceUtil .getMBMessage(thread.getRootMessageId()); if (mensagemRaiz.getClassPK() != 0) continue; Group grupo = GroupLocalServiceUtil.getGroup(thread .getGroupId()); adicionaAssinatura(assinaturas, subscricao, TipoAssinatura.FORUM_THREAD, grupo, mensagemRaiz.getSubject()); } catch (PortalException e) { // TODO log } } } /** * @param userId * @throws SystemException */ private void assinaturasNoWiki(long userId) throws SystemException { List<Subscription> subscricoes; // Nós de wiki subscricoes = SubscriptionLocalServiceUtil.getUserSubscriptions(userId, WikiNode.class.getName()); for (Subscription subscricao : subscricoes) { try { WikiNode noWiki = WikiNodeLocalServiceUtil .getWikiNode(subscricao.getClassPK()); Group grupo = GroupLocalServiceUtil.getGroup(noWiki .getGroupId()); adicionaAssinatura(assinaturas, subscricao, TipoAssinatura.WIKI_NODE, grupo, noWiki.getDescription()); } catch (PortalException e) { // TODO log } } } /** * @param userId * @throws SystemException */ private void assinaturasPaginaWiki(long userId) throws SystemException { List<Subscription> subscricoes; // Páginas wiki subscricoes = SubscriptionLocalServiceUtil.getUserSubscriptions(userId, WikiPage.class.getName()); for (Subscription subscricao : subscricoes) { try { WikiPage paginaWiki = WikiPageLocalServiceUtil .getWikiPage(subscricao.getClassPK()); Group grupo = GroupLocalServiceUtil.getGroup(paginaWiki .getGroupId()); adicionaAssinatura(assinaturas, subscricao, TipoAssinatura.WIKI_PAGE, grupo, paginaWiki.getTitle()); } catch (PortalException e) { // TODO log } } } /** * @param assinaturas * @param subscricao * @param mensagemRaiz * @param grupo * @throws PortalException * @throws SystemException */ private void adicionaAssinatura(List<Assinatura> assinaturas, Subscription subscricao, TipoAssinatura tipo, Group grupo, String titulo) throws PortalException, SystemException { Assinatura assinatura = new Assinatura(); assinatura.setComunidade(constroiNomeGrupo(grupo)); assinatura.setTipo(tipo); assinatura.setIdentificador("s" + subscricao.getSubscriptionId()); assinatura.setNome(StringUtil.shorten(titulo, 100)); assinaturas.add(assinatura); } private String constroiNomeGrupo(Group grupo) throws PortalException, SystemException { String nomeGrupo; if (!grupo.isLayout()) nomeGrupo = grupo.getDescriptiveName(); else { Group grupoPai = GroupLocalServiceUtil.getGroup(grupo.getClassPK()); nomeGrupo = grupoPai.getDescriptiveName() + " / " + grupo.getDescriptiveName(); } return nomeGrupo; } /** * Cancela uma assinatura * * @param identificador */ public String cancelar(String identificador) { if (identificador == null) return null; identificador = identificador.trim(); long userId = LiferayFacesContext.getInstance().getUserId(); if (identificador.length() < 2) return null; try { if (identificador.startsWith("n")) { String tipo = identificador.substring(1); AnnouncementsDelivery ad = AnnouncementsDeliveryLocalServiceUtil .getUserDelivery(userId, tipo); if (ad.getEmail()) { ad.setEmail(false); AnnouncementsDeliveryLocalServiceUtil .updateAnnouncementsDelivery(ad); } } else if (identificador.startsWith("s")) { long subscricaoId; try { subscricaoId = Long.parseLong(identificador.substring(1)); } catch (Exception e) { return null; } Subscription subscricao = SubscriptionLocalServiceUtil .getSubscription(subscricaoId); if (subscricao.getUserId() != userId) return null; SubscriptionLocalServiceUtil.deleteSubscription(subscricao); } } catch (PortalException e) { // TODO Log } catch (SystemException e) { throw new RuntimeException(e); } assinaturas = null; // Força recarregar return null; } }