/** * 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.movetopico.service.impl; import java.util.Collections; import java.util.Date; import java.util.List; import br.gov.camara.edemocracia.movetopico.model.InfoMoverTopico; import br.gov.camara.edemocracia.movetopico.model.Topico; import br.gov.camara.edemocracia.movetopico.service.base.MoveTopicoLocalServiceBaseImpl; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.kernel.search.Indexer; import com.liferay.portal.kernel.search.IndexerRegistryUtil; import com.liferay.portal.model.Group; import com.liferay.portal.model.User; import com.liferay.portal.security.permission.ActionKeys; import com.liferay.portal.security.permission.PermissionChecker; import com.liferay.portal.security.permission.PermissionCheckerFactoryUtil; import com.liferay.portal.service.GroupLocalServiceUtil; import com.liferay.portal.service.LockLocalServiceUtil; import com.liferay.portal.service.UserLocalServiceUtil; 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.messageboards.service.MBThreadServiceUtil; import com.liferay.portlet.messageboards.service.persistence.MBMessageUtil; import com.liferay.portlet.messageboards.service.persistence.MBThreadUtil; /** * The implementation of the move topico local service. * * <p> * All custom service methods should be put in this class. Whenever methods are * added, rerun ServiceBuilder to copy their definitions into the * {@link br.gov.camara.edemocracia.movetopico.service.MoveTopicoLocalService} * interface. * </p> * * <p> * Never reference this interface directly. Always use * {@link br.gov.camara.edemocracia.movetopico.service.MoveTopicoLocalServiceUtil} * to access the move topico local service. * </p> * * <p> * This is a local service. Methods of this service will not have security * checks based on the propagated JAAS credentials because this service can only * be accessed from within the same VM. * </p> * * @author Ricardo Lima * @see br.gov.camara.edemocracia.movetopico.service.base.MoveTopicoLocalServiceBaseImpl * @see br.gov.camara.edemocracia.movetopico.service.MoveTopicoLocalServiceUtil */ public class MoveTopicoLocalServiceImpl extends MoveTopicoLocalServiceBaseImpl { public List<Topico> getTopicosPorComunidadeEForum(long idComunidade, long idForum) { List<Topico> resultado = Collections.emptyList(); try { List<MBThread> resultadoParcial = MBThreadUtil.findByG_C( idComunidade, idForum); resultado = Lists.newArrayList(Iterables.transform(Iterables .filter(resultadoParcial, new Predicate<MBThread>() { @Override public boolean apply(MBThread input) { boolean result = false; try { result = !LockLocalServiceUtil.isLocked( MBThread.class.getName(), input.getThreadId()); } catch (SystemException e) { e.printStackTrace(); } return result; } }), new Function<MBThread, Topico>() { @Override public Topico apply(MBThread input) { String assunto = "(sem assunto)"; try { MBMessage mensagemRaiz = MBMessageLocalServiceUtil .getMBMessage(input.getRootMessageId()); String assuntoMensagem = mensagemRaiz.getSubject(); if (assuntoMensagem != null && !assuntoMensagem.isEmpty()) { assunto = assuntoMensagem; } } catch (PortalException e) { e.printStackTrace(); } catch (SystemException e) { e.printStackTrace(); } return new Topico(input.getThreadId(), assunto); } })); } catch (SystemException e) { e.printStackTrace(); } return resultado; } public List<MBCategory> getForunsComunidade(long idComunidade) { List<MBCategory> resultado = Collections.emptyList(); try { resultado = MBCategoryLocalServiceUtil.getCategories(idComunidade); } catch (SystemException e) { e.printStackTrace(); } return resultado; } public List<Group> getComunidadesComPermissaoParaMover(long idUsuario, final long idComunidadeOrigem) { List<Group> resultado = Collections.emptyList(); try { final Group comunidadeOrigem = GroupLocalServiceUtil .getGroup(idComunidadeOrigem); User usuario = UserLocalServiceUtil.getUser(idUsuario); final PermissionChecker verificador = PermissionCheckerFactoryUtil .create(usuario, true); List<Group> gruposUsuario = GroupLocalServiceUtil .getUserGroups(idUsuario); resultado = Lists.newArrayList(Iterables.filter(gruposUsuario, new Predicate<Group>() { @Override public boolean apply(Group grupo) { return grupo.isCommunity() && idComunidadeOrigem != grupo.getGroupId() && grupo.getCompanyId() == comunidadeOrigem .getCompanyId() && verificador.hasPermission( grupo.getGroupId(), "com.liferay.portlet.messageboards", grupo.getGroupId(), ActionKeys.MOVE_THREAD); } })); } catch (PortalException e) { e.printStackTrace(); } catch (SystemException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return resultado; } public void moveTopico(InfoMoverTopico info) throws PortalException, SystemException { MBThread topico = MBThreadLocalServiceUtil.getMBThread(info .getIdTopico()); MBMessage mensagemRaizOriginal = MBMessageLocalServiceUtil .getMBMessage(topico.getRootMessageId()); List<MBMessage> mensagens = MBMessageUtil.filterFindByG_C_T( info.getIdComunidadeOrigem(), info.getIdForumOrigem(), info.getIdTopico()); Group comunidadeDestino = GroupLocalServiceUtil.getGroup(info .getIdComunidadeDestino()); Indexer indexadorMensagens = IndexerRegistryUtil .getIndexer(MBMessage.class); topico.setCategoryId(info.getIdForumDestino()); topico.setGroupId(info.getIdComunidadeDestino()); MBThreadLocalServiceUtil.updateMBThread(topico, true); int msgCount = 0; for (MBMessage mensagem : mensagens) { msgCount++; mensagem.setGroupId(info.getIdComunidadeDestino()); mensagem.setCategoryId(info.getIdForumDestino()); mensagem.setThreadId(info.getIdTopico()); MBMessageLocalServiceUtil.updateMBMessage(mensagem, true); resourceLocalService.addResources(comunidadeDestino.getCompanyId(), comunidadeDestino.getGroupId(), info.getIdUsuario(), MBMessage.class.getName(), mensagem.getMessageId(), false, true, true); indexadorMensagens.reindex(mensagem); } MBCategory forumDestino = MBCategoryLocalServiceUtil.getCategory(info .getIdForumDestino()); forumDestino.setThreadCount(forumDestino.getThreadCount() + 1); forumDestino.setMessageCount(forumDestino.getMessageCount() + msgCount); MBCategoryLocalServiceUtil.updateMBCategory(forumDestino, true); long idmensagemRaizAtual = counterLocalService .increment(MBMessage.class.getName()); long idtopicoAtual = counterLocalService.increment(MBThread.class .getName()); Date now = new Date(); User user = UserLocalServiceUtil.getUser(info.getIdUsuario()); String userName = user.getFullName(); String userUUID = user.getUserUuid(); MBMessage mensagemRaizAtual = MBMessageLocalServiceUtil .createMBMessage(idmensagemRaizAtual); MBThread topicoAtual = MBThreadLocalServiceUtil .createMBThread(idtopicoAtual); mensagemRaizAtual.setCompanyId(mensagemRaizOriginal.getCompanyId()); mensagemRaizAtual.setGroupId(info.getIdComunidadeOrigem()); mensagemRaizAtual.setCategoryId(info.getIdForumOrigem()); mensagemRaizAtual.setCreateDate(now); mensagemRaizAtual.setNew(true); mensagemRaizAtual.setBody("Esta mensagem foi movida para o fórum [b]" + info.getNomeForumDestino() + "[/b] da comunidade [url='" + info.getUrlComunidadeDestino() + "']" + info.getNomeComunidadeDestino() + "[/url]"); mensagemRaizAtual.setSubject(mensagemRaizOriginal.getSubject()); mensagemRaizAtual.setClassNameId(0); mensagemRaizAtual.setClassPK(0); mensagemRaizAtual.setAnonymous(false); mensagemRaizAtual.setAttachments(false); mensagemRaizAtual.setParentMessageId(0); mensagemRaizAtual.setRootMessageId(idmensagemRaizAtual); mensagemRaizAtual.setStatus(0); mensagemRaizAtual.setStatusDate(now); mensagemRaizAtual.setStatusByUserId(info.getIdUsuario()); mensagemRaizAtual.setStatusByUserName(userName); mensagemRaizAtual.setStatusByUserUuid(userUUID); mensagemRaizAtual.setModifiedDate(now); mensagemRaizAtual.setThreadId(idtopicoAtual); mensagemRaizAtual.setUserId(info.getIdUsuario()); mensagemRaizAtual.setUserName(userName); mensagemRaizAtual.setUserUuid(userUUID); topicoAtual.setGroupId(info.getIdComunidadeOrigem()); topicoAtual.setCategoryId(info.getIdForumOrigem()); topicoAtual.setMessageCount(1); topicoAtual.setNew(true); topicoAtual.setRootMessageId(idmensagemRaizAtual); topicoAtual.setStatus(0); topicoAtual.setStatusByUserId(info.getIdUsuario()); topicoAtual.setStatusDate(now); topicoAtual.setStatusByUserName(userName); topicoAtual.setStatusByUserUuid(userUUID); topicoAtual.setLastPostDate(now); topicoAtual.setLastPostByUserId(info.getIdUsuario()); topicoAtual.setLastPostByUserUuid(userUUID); MBMessageLocalServiceUtil.updateMBMessage(mensagemRaizAtual, true); MBThreadLocalServiceUtil.updateMBThread(topicoAtual, true); MBThreadServiceUtil.lockThread(idtopicoAtual); } }