/** * 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.wikilegis.service.impl; import java.util.List; import java.util.Map; import br.gov.camara.edemocracia.portlets.wikilegis.ArtigoDisplay; import br.gov.camara.edemocracia.portlets.wikilegis.NoSuchArtigoException; import br.gov.camara.edemocracia.portlets.wikilegis.model.Artigo; import br.gov.camara.edemocracia.portlets.wikilegis.model.Contribuicao; import br.gov.camara.edemocracia.portlets.wikilegis.service.base.ArtigoLocalServiceBaseImpl; import com.liferay.portal.kernel.dao.orm.QueryUtil; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.kernel.transaction.Transactional; import com.liferay.portal.model.Group; import com.liferay.portal.service.GroupServiceUtil; import com.liferay.portlet.messageboards.model.MBCategory; import com.liferay.portlet.messageboards.model.MBMessageDisplay; import com.liferay.portlet.messageboards.model.MBThread; import com.liferay.portlet.messageboards.service.MBCategoryLocalServiceUtil; import com.liferay.portlet.messageboards.service.MBDiscussionLocalServiceUtil; import com.liferay.portlet.messageboards.service.MBMessageLocalServiceUtil; import com.liferay.portlet.messageboards.service.MBThreadLocalServiceUtil; /** * The implementation of the artigo 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.portlets.wikilegis.service.ArtigoLocalService} * interface. * </p> * * <p> * Never reference this interface directly. Always use * {@link br.gov.camara.edemocracia.portlets.wikilegis.service.ArtigoLocalServiceUtil} * to access the artigo 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 robson * @see br.gov.camara.edemocracia.portlets.wikilegis.service.base.ArtigoLocalServiceBaseImpl * @see br.gov.camara.edemocracia.portlets.wikilegis.service.ArtigoLocalServiceUtil */ public class ArtigoLocalServiceImpl extends ArtigoLocalServiceBaseImpl { /** * Lista os filhos do pai especificado */ @Override public List<Artigo> listaArtigos(long groupId, long estruturaId) throws SystemException { return artigoPersistence.findByG_E(groupId, estruturaId, QueryUtil.ALL_POS, QueryUtil.ALL_POS, new ArtigoComparator()); } /** * Lista os filhos do pai especificado, já formatados para visualização * * @param groupId * @param estruturaId * @return */ @Override public List<ArtigoDisplay> listaArtigoDisplay(long groupId, long estruturaId) { return artigoFinder.findDisplayByG_E(groupId, estruturaId); } /** * Lista todos os artigos do grupo especificadoz * * @param groupId * @return */ @Override public Map<Long, List<ArtigoDisplay>> listaArtigoDisplay(long groupId) { return artigoFinder.findAllArtigoDisplay(groupId); } /** * Cria um artigo no nó especificado * * @param groupId * @param estruturaId * @param texto * @param legislacaoVigente * @param ordem * * @throws SystemException * @throws PortalException * * @return Artigo artigo recém-criado */ @Override public Artigo criaArtigo(long groupId, long estruturaId, long anteriorArtigoId, String texto, String legislacaoVigente) throws SystemException, PortalException { // Formata Group group = GroupServiceUtil.getGroup(groupId); long companyId = group.getCompanyId(); // Insere o artigo na posição correta int ordem = atualizaPosicaoArtigos(groupId, estruturaId, anteriorArtigoId); Artigo artigo = artigoPersistence.create(counterLocalService .increment()); artigo.setCompanyId(companyId); artigo.setGroupId(groupId); artigo.setEstruturaId(estruturaId); artigo.setOrdem(ordem); artigo.setTexto(texto); artigo.setLegislacaoVigente(legislacaoVigente); return artigoPersistence.update(artigo, true); } /** * @param groupId * @param estruturaId * @param anteriorArtigoId * @return * @throws PortalException * @throws SystemException */ private int atualizaPosicaoArtigos(long groupId, long estruturaId, long anteriorArtigoId) throws PortalException, SystemException { int ordem = 0; if (anteriorArtigoId > 0l) { Artigo anterior = getArtigo(anteriorArtigoId); // Deve estar na mesma estrutura if (anterior.getEstruturaId() == estruturaId) ordem = anterior.getOrdem() + 1; } List<Artigo> antigos = artigoPersistence .findByG_E(groupId, estruturaId); for (Artigo antigo : antigos) { if (antigo.getOrdem() >= ordem) { antigo.setOrdem(antigo.getOrdem() + 1); artigoPersistence.update(antigo, false); } } return ordem; } /** * Exclui um artigo e seus comentários * * @param artigoId * @throws SystemException * @throws PortalException */ public void excluiArtigo(long artigoId) throws PortalException, SystemException { Artigo artigo = getArtigo(artigoId); long groupId = artigo.getGroupId(); long estruturaId = artigo.getEstruturaId(); // Atualiza a ordem dos artigos List<Artigo> artigosNoNivel = artigoPersistence.findByG_E(groupId, estruturaId); for (Artigo outroArtigo : artigosNoNivel) { if (outroArtigo.getOrdem() > artigo.getOrdem()) { outroArtigo.setOrdem(outroArtigo.getOrdem() - 1); artigoPersistence.update(outroArtigo, false); } } // Exclui as contribuições List<Contribuicao> contribuicoes = contribuicaoPersistence.findByA(artigoId); for (Contribuicao contrib : contribuicoes) { contribuicaoPersistence.remove(contrib); } // Exclui o artigo deleteArtigo(artigo); } /** * Atualiza um artigo * * @param userId * @param artigoId * @param textoArtigo * @param legislacaoVigente * @throws SystemException * @throws PortalException */ @Transactional(rollbackFor = NoSuchArtigoException.class) public Artigo atualizaArtigo(long userId, long artigoId, long estruturaId, long anteriorArtigoId, String textoArtigo, String legislacaoVigente) throws SystemException, PortalException { // Atualiza o texto if (textoArtigo == null) textoArtigo = ""; textoArtigo = textoArtigo.trim(); if (legislacaoVigente == null) legislacaoVigente = ""; legislacaoVigente = legislacaoVigente.trim(); Artigo artigo = artigoPersistence.findByPrimaryKey(artigoId); artigo.setTexto(textoArtigo); artigo.setLegislacaoVigente(legislacaoVigente); // Verifica se alterou a estrurura // if (artigo.getEstruturaId() != estruturaId) { List<Artigo> artigos = artigoPersistence.findByG_E(artigo.getGroupId(), artigo.getEstruturaId()); int ordemAnterior = artigo.getOrdem(); // Altera a numeração, retirando o nó da hierarquia existente artigo.setEstruturaId(estruturaId); artigo.setOrdem(-1); artigoPersistence.update(artigo, false); for (Artigo anterior : artigos) { if (anterior.getArtigoId() != artigo.getArtigoId() && anterior.getOrdem() > ordemAnterior) { anterior.setOrdem(anterior.getOrdem() - 1); artigoPersistence.update(anterior, false); } } // } // Altera a posição do artigo int ordem = atualizaPosicaoArtigos(artigo.getGroupId(), estruturaId, anteriorArtigoId); artigo.setOrdem(ordem); return artigoPersistence.update(artigo, false); } }