/**
* 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.priorizacao.service.impl;
import java.util.List;
import br.gov.camara.edemocracia.portlets.priorizacao.NoSuchEixoException;
import br.gov.camara.edemocracia.portlets.priorizacao.model.Eixo;
import br.gov.camara.edemocracia.portlets.priorizacao.model.Proposta;
import br.gov.camara.edemocracia.portlets.priorizacao.service.PropostaLocalServiceUtil;
import br.gov.camara.edemocracia.portlets.priorizacao.service.base.EixoLocalServiceBaseImpl;
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;
/**
* The implementation of the eixo 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.priorizacao.service.EixoLocalService}
* interface.
* </p>
*
* <p>
* Never reference this interface directly. Always use
* {@link br.gov.camara.edemocracia.portlets.priorizacao.service.EixoLocalServiceUtil}
* to access the eixo 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.priorizacao.service.base.EixoLocalServiceBaseImpl
* @see br.gov.camara.edemocracia.portlets.priorizacao.service.EixoLocalServiceUtil
*/
public class EixoLocalServiceImpl extends EixoLocalServiceBaseImpl {
/**
* Lista todos os eixos
*
* @return
* @throws SystemException
*/
public List<Eixo> listarEixosPorGroupId(long groupId) throws SystemException {
return eixoPersistence.findByG(groupId, QueryUtil.ALL_POS, QueryUtil.ALL_POS,new EixoComparator());
}
/**
* Cria um eixo na posição especificada
*
* @param groupId
* @param categoryId
* @param sumario
* @param titulo
* @param eixoAnteriorId
* @return
* @throws SystemException
* @throws PortalException
*/
public Eixo addEixo(long groupId, long categoryId, String sumario,
String titulo, long eixoAnteriorId) throws SystemException,
PortalException {
Group group = GroupServiceUtil.getGroup(groupId);
long companyId = group.getCompanyId();
// Insere o eixo na posição correta
int ordem = atualizarPosicaoEixos(groupId, eixoAnteriorId);
Eixo eixo = createEixo(counterLocalService.increment());
eixo.setOrdem(ordem);
eixo.setGroupId(groupId);
eixo.setCompanyId(companyId);
eixo.setSumario(sumario);
eixo.setTitulo(titulo);
eixo.setCategoryId(categoryId);
return eixoPersistence.update(eixo, true);
}
/**
* Atualiza um eixo
*
* @param eixoId
* @param sumario
* @param titulo
* @param eixoAnteriorId
* @param categoryId
* @return
* @throws SystemException
* @throws PortalException
*/
@Transactional(rollbackFor = NoSuchEixoException.class)
public Eixo updateEixo(long eixoId, String sumario,
String titulo, long eixoAnteriorId, long categoryId)
throws SystemException, PortalException {
if(sumario == null)
sumario = "";
sumario = sumario.trim();
if(titulo == null)
titulo = "";
titulo = titulo.trim();
Eixo eixo = eixoPersistence.findByPrimaryKey(eixoId);
eixo.setSumario(sumario);
eixo.setTitulo(titulo);
eixo.setCategoryId(categoryId);
int ordemAnterior = eixo.getOrdem();
eixo.setOrdem(-1);
eixoPersistence.update(eixo, false);
List<Eixo> eixos = listarEixosPorGroupId(eixo.getGroupId());
for (Eixo anterior : eixos) {
if (anterior.getOrdem() > ordemAnterior) {
anterior.setOrdem(anterior.getOrdem() - 1);
eixoPersistence.update(anterior, false);
}
}
int ordem = atualizarPosicaoEixos(eixo.getGroupId(), eixoAnteriorId);
eixo.setOrdem(ordem);
return eixoPersistence.update(eixo,false);
}
private int atualizarPosicaoEixos(long groupId, long eixoAnteriorId)
throws PortalException, SystemException {
int ordem = 0;
if (eixoAnteriorId > 0l) {
Eixo anterior = getEixo(eixoAnteriorId);
ordem = anterior.getOrdem() + 1;
}
List<Eixo> antigos = eixoPersistence.findByG(groupId);
for (Eixo antigo : antigos) {
if (antigo.getOrdem() >= ordem) {
antigo.setOrdem(antigo.getOrdem() + 1);
eixoPersistence.update(antigo, false);
}
}
return ordem;
}
/**
* Remove o eixo especificado
*
* @param eixo
* @throws SystemException
*/
public void excluirEixo(Eixo eixo) throws SystemException {
List<Proposta> propostas = propostaPersistence.findByE(eixo.getEixoId());
//Deletando todas as propostas do eixo
for(Proposta proposta: propostas){
long propostaId = proposta.getPropostaId();
votoPersistence.removeByP(propostaId);
PropostaLocalServiceUtil.deleteProposta(proposta);
}
int ordemAnterior = eixo.getOrdem();
List<Eixo> eixos = listarEixosPorGroupId(eixo.getGroupId());
for (Eixo anterior : eixos) {
if (anterior.getOrdem() > ordemAnterior) {
anterior.setOrdem(anterior.getOrdem() - 1);
eixoPersistence.update(anterior, false);
}
}
//Deletando eixo
super.deleteEixo(eixo);
}
/**
* Remove um eixo e suas propostas
*
* @param eixoId
* @throws PortalException
* @throws SystemException
*/
public void excluirEixo(long eixoId) throws PortalException, SystemException{
deleteEixo(eixoPersistence.findByPrimaryKey(eixoId));
}
/**
* Retorna o a quantidade de eixos cadastrados na comunidade especificada
*
* @param groupId
* @return
* @throws SystemException
*/
public int getEixosCountByGroupId(long groupId) throws SystemException{
return eixoPersistence.countByG(groupId);
}
}