/**
* 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.InvalidIdentificadorException;
import br.gov.camara.edemocracia.portlets.priorizacao.NoSuchPropostaException;
import br.gov.camara.edemocracia.portlets.priorizacao.PropostaDisplay;
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.base.PropostaLocalServiceBaseImpl;
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.GroupLocalServiceUtil;
/**
* The implementation of the proposta 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.PropostaLocalService}
* interface.
* </p>
*
* <p>
* Never reference this interface directly. Always use
* {@link br.gov.camara.edemocracia.portlets.priorizacao.service.PropostaLocalServiceUtil}
* to access the proposta 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.PropostaLocalServiceBaseImpl
* @see br.gov.camara.edemocracia.portlets.priorizacao.service.PropostaLocalServiceUtil
*/
public class PropostaLocalServiceImpl extends PropostaLocalServiceBaseImpl {
/**
* Obtém a proposta especificada
*
* @param propostaId
* @return
* @throws SystemException
* @throws PortalException
*/
public Proposta getProposta(long propostaId) throws PortalException,
SystemException {
return propostaPersistence.findByPrimaryKey(propostaId);
}
/**
* Lista todas as propostas vinculadas ao eixo especificado
*
* @param eixoId
* @return
* @throws SystemException
*/
public List<Proposta> listarPropostasPorEixoId(long eixoId)
throws SystemException {
return propostaPersistence.findByE(eixoId, QueryUtil.ALL_POS,
QueryUtil.ALL_POS, new PropostaComparator());
}
/**
* Cria uma proposta
*
* @param groupId
* @param eixoId
* @param ementa
* @param texto
* @param threadId
* @param identificador
* @throws PortalException
* @throws SystemException
*/
@Transactional(rollbackFor = InvalidIdentificadorException.class)
public Proposta addProposta(long groupId, long eixoId, String ementa,
String texto, long threadId, String identificador)
throws SystemException, PortalException {
// Valida identificador
identificador = tratarString(identificador);
if (identificador.length() == 0)
throw new InvalidIdentificadorException();
if (validarIdentificador(identificador, 0, groupId))
throw new InvalidIdentificadorException("Identificador Inválido");
ementa = tratarString(ementa);
texto = tratarString(texto);
Group group = GroupLocalServiceUtil.getGroup(groupId);
long companyId = group.getCompanyId();
Proposta proposta = createProposta(counterLocalService.increment());
proposta.setGroupId(groupId);
proposta.setCompanyId(companyId);
proposta.setEixoId(eixoId);
proposta.setEmenta(ementa);
proposta.setTexto(texto);
proposta.setThreadId(threadId);
proposta.setIdentificador(identificador);
return propostaPersistence.update(proposta, true);
}
/**
* Atualiza a proposta especificada
*
* @param propostaId
* @param eixoId
* @param ementa
* @param texto
* @param threadId
* @param identificador
* @return
* @throws SystemException
* @throws PortalException
*/
public Proposta updateProposta(long propostaId, long eixoId, String ementa,
String texto, long threadId, String identificador)
throws SystemException, PortalException {
Proposta proposta = propostaPersistence.findByPrimaryKey(propostaId);
// Valida identificador
identificador = tratarString(identificador);
if (identificador.length() == 0)
throw new InvalidIdentificadorException();
if (validarIdentificador(identificador, propostaId,
proposta.getGroupId()))
throw new InvalidIdentificadorException();
ementa = tratarString(ementa);
texto = tratarString(texto);
proposta.setTexto(texto);
proposta.setEmenta(ementa);
proposta.setEixoId(eixoId);
proposta.setThreadId(threadId);
proposta.setIdentificador(identificador);
return super.updateProposta(proposta, false);
}
/**
* Deleta a proposta especificada
*
* @param propostaId
* @throws PortalException
* @throws SystemException
*/
public void excluirProposta(long propostaId) throws PortalException,
SystemException {
votoPersistence.removeByP(propostaId);
super.deleteProposta(propostaId);
}
/**
* Deleta a proposta especificada
*/
public void excluirProposta(Proposta proposta) throws SystemException {
votoPersistence.removeByP(proposta.getPropostaId());
super.deleteProposta(proposta);
}
private String tratarString(String texto) {
if (texto == null)
return "";
else
return texto.trim();
}
/**
* Verifica se o identificador já está cadastrado na comunidade
*
* @param identificador
* @param propostaId
* @param groupId
* @return
* @throws SystemException
*/
private boolean validarIdentificador(String identificador, long propostaId,
long groupId) throws SystemException {
try {
Proposta p = propostaPersistence.findByI_G_First(identificador,
groupId, null);
if (p == null)
return false;
if (propostaId <= 0)
return true;
if (p.getPropostaId() == propostaId)
return false;
else
return true;
} catch (NoSuchPropostaException e) {
return false;
}
}
/**
* Retorna a quantidade de propostas cadastradas para o eixo especificado
*
* @param eixoId
* @return
* @throws SystemException
*/
@Override
public int getPropostasCountByEixoId(long eixoId) throws SystemException {
return propostaPersistence.countByE(eixoId);
}
/**
* Lista o estado da votação para cada proposta, de acordo com as permissões
* do usuário
*
* @param userId
* @param eixoId
* @param podeVerVotos
* @param podeVotar
* @return
* @throws SystemException
* @throws PortalException
*/
@Override
public List<PropostaDisplay> findPropostaDisplayPorUsuarioEixoId(
long userId, long eixoId, boolean podeVerVotos, boolean podeVotar)
throws SystemException, PortalException {
Eixo eixo = eixoLocalService.getEixo(eixoId);
int votosDisponiveis;
// Verifica se o usuário pode votar
if (userId < 0)
podeVotar = false;
if (podeVotar) {
votosDisponiveis = votoLocalService.getVotosDisponiveisByUsuarioId(
eixo.getGroupId(), userId);
if (votosDisponiveis <= 0) {
votosDisponiveis = 0;
}
} else {
votosDisponiveis = 0;
}
return propostaFinder.findPropostaDisplayByUserEixo(userId, eixoId, votosDisponiveis, podeVerVotos, podeVotar);
}
}