/**
* 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.guiadiscussao.service.impl;
import java.util.List;
import br.gov.camara.edemocracia.portlets.guiadiscussao.CantFaseMoveDownException;
import br.gov.camara.edemocracia.portlets.guiadiscussao.CantFaseMoveUpException;
import br.gov.camara.edemocracia.portlets.guiadiscussao.model.Acao;
import br.gov.camara.edemocracia.portlets.guiadiscussao.model.Configuracao;
import br.gov.camara.edemocracia.portlets.guiadiscussao.model.Fase;
import br.gov.camara.edemocracia.portlets.guiadiscussao.service.AcaoLocalServiceUtil;
import br.gov.camara.edemocracia.portlets.guiadiscussao.service.base.FaseLocalServiceBaseImpl;
import br.gov.camara.edemocracia.portlets.guiadiscussao.service.persistence.FasePersistence;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
/**
* The implementation of the fase 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.guiadiscussao.service.FaseLocalService}
* interface.
*
* <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.guiadiscussao.service.base.FaseLocalServiceBaseImpl
* @see br.gov.camara.edemocracia.portlets.guiadiscussao.service.FaseLocalServiceUtil
*/
public class FaseLocalServiceImpl extends FaseLocalServiceBaseImpl {
/*
* NOTE FOR DEVELOPERS:
*
* Never reference this interface directly. Always use {@link
* br.gov.camara.edemocracia
* .portlets.guiadiscussao.service.FaseLocalServiceUtil} to access the fase
* local service.
*/
public Fase criaFase(Fase fase) throws PortalException, SystemException {
FasePersistence fasePersistence = getFasePersistence();
Fase novaFase = fasePersistence.create(getCounterLocalService()
.increment(Fase.class.getName()));
novaFase.setTitulo(fase.getTitulo());
novaFase.setConfiguracaoId(fase.getConfiguracaoId());
int totalDeFases = fasePersistence.countByConfiguracaoId(fase
.getConfiguracaoId());
novaFase.setOrdem(totalDeFases + 1);
if (totalDeFases == 0) {
Configuracao config;
config = configuracaoLocalService.getConfiguracao(fase
.getConfiguracaoId());
config.setFaseAtualId(novaFase.getFaseId());
configuracaoLocalService.updateConfiguracao(config, false);
}
return fasePersistence.update(novaFase, false);
}
public List<Fase> getFasesByConfiguracaoId(long configuracaoId)
throws SystemException {
return getFasePersistence().findByConfiguracaoId(configuracaoId);
}
public void excluirFase(long faseId) throws PortalException,
SystemException {
//fase que será excluída
Fase fase = getFase(faseId);
List<Fase> fasesDaComunidade = getFasePersistence()
.findByConfiguracaoId(fase.getConfiguracaoId());
// Removendo ações cadastradas para esta fase
List<Acao> acoesCadastradas = AcaoLocalServiceUtil
.getAcoesByFaseId(fase.getFaseId());
for (Acao acao : acoesCadastradas) {
AcaoLocalServiceUtil.excluirAcao(acao.getAcaoId());
}
if (fasesDaComunidade.size() != 1) {
// Atualização de próxima fase atual
long faseAtualId = configuracaoLocalService.getConfiguracao(
fase.getConfiguracaoId()).getFaseAtualId();
if(fase.getFaseId() == faseAtualId) {
Fase fasePosterior = null;
Fase faseAnterior = null;
for (Fase outraFase : fasesDaComunidade) {
// Guardando a fase anterior a fase que será excluida
if (outraFase.getOrdem() == fase.getOrdem() - 1) {
faseAnterior = outraFase;
}
// Guardando a fase posterior a fase que será excluida
if (outraFase.getOrdem() == fase.getOrdem() + 1) {
fasePosterior = outraFase;
}
}
// Marcando próxima fase atual
if (fasePosterior != null || faseAnterior != null) {
Fase faseAtual = null;
if (fasePosterior != null) {
faseAtual = fasePosterior;
} else {
faseAtual = faseAnterior;
}
Configuracao configuracao = configuracaoLocalService
.getConfiguracao(fase.getConfiguracaoId());
configuracao.setFaseAtualId(faseAtual.getFaseId());
configuracaoLocalService
.updateConfiguracao(configuracao, false);
}
}
// Atualiza a ordem das demais fases
for (Fase outraFase : fasesDaComunidade) {
if (outraFase.getOrdem() > fase.getOrdem()) {
outraFase.setOrdem(outraFase.getOrdem() - 1);
fasePersistence.update(outraFase, false);
}
}
}
deleteFase(fase);
}
public void moverFaseParaCima(long faseId) throws PortalException,
SystemException, CantFaseMoveUpException {
Fase fase = getFase(faseId);
if (fase != null) {
if (fase.getOrdem() == 1) {
throw new CantFaseMoveUpException();
}
}
// Atualiza a ordem das demais fases
List<Fase> fasesDaComunidade = getFasePersistence()
.findByConfiguracaoId(fase.getConfiguracaoId());
for (Fase outraFase : fasesDaComunidade) {
if (outraFase.getOrdem() == fase.getOrdem() - 1) {
outraFase.setOrdem(outraFase.getOrdem() + 1);
fasePersistence.update(outraFase, false);
}
}
fase.setOrdem(fase.getOrdem() - 1);
fasePersistence.update(fase, false);
}
public void moverFaseParaBaixo(long faseId) throws PortalException,
SystemException, CantFaseMoveDownException {
Fase fase = getFase(faseId);
if (fase != null) {
int totalDeFases = fasePersistence.countByConfiguracaoId(fase
.getConfiguracaoId());
if (fase.getOrdem() == totalDeFases) {
throw new CantFaseMoveDownException();
}
}
// Atualiza a ordem das demais fases
List<Fase> fasesDaComunidade = getFasePersistence()
.findByConfiguracaoId(fase.getConfiguracaoId());
for (Fase outraFase : fasesDaComunidade) {
if (outraFase.getOrdem() == fase.getOrdem() + 1) {
outraFase.setOrdem(outraFase.getOrdem() - 1);
fasePersistence.update(outraFase, false);
}
}
fase.setOrdem(fase.getOrdem() + 1);
fasePersistence.update(fase, false);
}
}