/**
* 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.graficos.service.impl;
import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import org.apache.commons.beanutils.BeanUtils;
import org.joda.time.DateTimeZone;
import org.joda.time.MutableDateTime;
import br.gov.camara.edemocracia.portlets.graficos.DadosComunidadeDTO;
import br.gov.camara.edemocracia.portlets.graficos.DadosUsuarioDTO;
import br.gov.camara.edemocracia.portlets.graficos.service.base.ParticipacaoLocalServiceBaseImpl;
import com.liferay.faces.portal.context.LiferayFacesContext;
import com.liferay.portal.kernel.dao.jdbc.DataAccess;
import com.liferay.portal.kernel.dao.orm.DynamicQuery;
import com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil;
import com.liferay.portal.kernel.dao.orm.OrderFactoryUtil;
import com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.util.PortalClassLoaderUtil;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.model.Group;
import com.liferay.portal.model.GroupConstants;
import com.liferay.portal.service.ClassNameLocalServiceUtil;
import com.liferay.portal.service.GroupLocalServiceUtil;
/**
* The implementation of the participacao 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.graficos.service.ParticipacaoLocalService}
* interface.
* </p>
*
* <p>
* Never reference this interface directly. Always use
* {@link br.gov.camara.edemocracia.portlets.graficos.service.ParticipacaoLocalServiceUtil}
* to access the participacao 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 Bruno Evangelista
* @see br.gov.camara.edemocracia.portlets.graficos.service.base.ParticipacaoLocalServiceBaseImpl
* @see br.gov.camara.edemocracia.portlets.graficos.service.ParticipacaoLocalServiceUtil
*/
public class ParticipacaoLocalServiceImpl extends
ParticipacaoLocalServiceBaseImpl {
/**
* Lista todas as comunidades públicas, privadas e restritas da companhia
*
* @throws SystemException
*/
@SuppressWarnings("unchecked")
public List<Group> getComunidadesDisponiveis(final long companyId)
throws SystemException {
final long groupClassNameId = ClassNameLocalServiceUtil
.getClassNameId(Group.class);
final DynamicQuery query = DynamicQueryFactoryUtil.forClass(
Group.class, PortalClassLoaderUtil.getClassLoader());
query.add(RestrictionsFactoryUtil.eq("companyId", companyId));
query.add(RestrictionsFactoryUtil.eq("classNameId", groupClassNameId));
query.add(RestrictionsFactoryUtil.in("type", new Object[] {
GroupConstants.TYPE_SITE_OPEN,
GroupConstants.TYPE_SITE_PRIVATE,
GroupConstants.TYPE_SITE_RESTRICTED }));
query.add(RestrictionsFactoryUtil.eq("parentGroupId",
GroupConstants.DEFAULT_PARENT_GROUP_ID));
query.add(RestrictionsFactoryUtil.eq("active", true));
query.add(RestrictionsFactoryUtil.ne("name",
GroupConstants.CONTROL_PANEL));
query.addOrder(OrderFactoryUtil.asc("name"));
return (List<Group>) GroupLocalServiceUtil.dynamicQuery(query);
}
/**
* Recupera todos os dados dos usuários que participaram das comunidades
* especificadas.
*
* @throws SystemException
* @throws PortalException
*/
public List<DadosComunidadeDTO> getDadosComunidade(final List<Long> groups)
throws PortalException, SystemException {
List<DadosComunidadeDTO> retorno = getDadosComunidade(groups, null, null);
Collections.sort(retorno, new DadosComunidadeDTOComparator());
return retorno;
}
/**
* Recupera todos os dados dos usuários que participaram das comunidades
* especificadas.
*
* @throws SystemException
* @throws PortalException
*/
public List<DadosComunidadeDTO> getDadosComunidade(List<Long> groups,
Date dataInicio, Date dataFim) throws PortalException,
SystemException {
List<DadosComunidadeDTO> retorno = new ArrayList<DadosComunidadeDTO>();
for (Long groupId : groups) {
retorno.add(getDadosComunidade(groupId, dataInicio, dataFim));
}
Collections.sort(retorno, new DadosComunidadeDTOComparator());
return retorno;
}
/**
* Recupera todos os dados dos usuários que participaram da comunidade
* especificada.
*/
public DadosComunidadeDTO getDadosComunidade(Long groupId)
throws PortalException, SystemException {
return getDadosComunidade(groupId, null, null);
}
/**
* Recupera todos os dados dos usuários que participaram da comunidade
* especificada dentro do periodo especificado.
*/
public DadosComunidadeDTO getDadosComunidade(Long groupId, Date dataInicio,
Date dataFim) throws PortalException, SystemException {
Group group = GroupLocalServiceUtil.getGroup(groupId);
LinkedHashMap<Long, DadosUsuarioDTO> listaDadosUsuario = new LinkedHashMap<Long, DadosUsuarioDTO>();
DadosComunidadeDTO dadosComunidade = new DadosComunidadeDTO(groupId,
group.getName(), listaDadosUsuario);
Connection conn = null;
try {
conn = DataAccess.getConnection();
ParticipacaoSQLQueries[] participacaoQueries = ParticipacaoSQLQueries
.values();
for (ParticipacaoSQLQueries participacaoQuery : participacaoQueries) {
consultaParticipacao(conn, participacaoQuery,
listaDadosUsuario, groupId, dataInicio, dataFim);
}
consultaMembros(conn, listaDadosUsuario, groupId);
} catch (SQLException e) {
throw new SystemException(e);
} finally {
DataAccess.cleanUp(conn);
}
return dadosComunidade;
}
/**
*
* Consulta as participações do usuário realizadas no período especificado e
* adiciona esses dados a lista passada por parametro.
*
* @param conn
* @param participacaoQuery
* @param listaDadosUsuario
* lista de usuários que fizeram alguma participação na
* comunidade
* @param groupId
* comunidade que deseja pesquisar
* @param dataInicio
* data de inicio do período
* @param dataFim
* data de término do período
* @throws SQLException
* @throws SystemException
*/
private void consultaParticipacao(Connection conn,
ParticipacaoSQLQueries participacaoQuery,
Map<Long, DadosUsuarioDTO> listaDadosUsuario, Long groupId,
Date dataInicio, Date dataFim) throws SQLException, SystemException {
PreparedStatement pstmt = preparaStatementDeParticipacao(conn,
participacaoQuery, groupId, dataInicio, dataFim);
executaConsultaParticipacao(participacaoQuery, listaDadosUsuario, pstmt);
}
private void executaConsultaParticipacao(
ParticipacaoSQLQueries participacaoQuery,
Map<Long, DadosUsuarioDTO> listaDadosUsuario,
PreparedStatement pstmt) throws SQLException, SystemException {
try {
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
long userId = rs.getInt(1);
// Verifica se o usuário já possui o objeto de dados
// DadosUsuarioDTO
if (!listaDadosUsuario.containsKey(userId)) {
String username = rs.getString(2);
String email = rs.getString(3);
listaDadosUsuario.put(userId, new DadosUsuarioDTO(userId,
username, email));
}
// Insere dado do resultset na propriedade especificada do bean
// DadosUsuarioDTO
try {
BeanUtils.setProperty(listaDadosUsuario.get(userId),
participacaoQuery.getPropriedadeBean(),
rs.getObject(4));
} catch (IllegalAccessException e) {
throw new SystemException();
} catch (InvocationTargetException e) {
throw new SystemException();
}
}
} finally {
DataAccess.cleanUp(pstmt);
}
}
private PreparedStatement preparaStatementDeParticipacao(Connection conn,
ParticipacaoSQLQueries participacaoQuery, Long groupId,
Date dataInicio, Date dataFim) throws SQLException {
PreparedStatement pstmt = null;
if ((dataInicio == null) && (dataFim == null)) {
String sql = participacaoQuery.getQuery(groupId);
pstmt = conn.prepareStatement(sql);
} else {
// Adicionando periodo de data ao pstmt
String sql = participacaoQuery.getQueryParaPeriodo(groupId);
pstmt = conn.prepareStatement(sql);
TimeZone tz = LiferayFacesContext.getInstance().getUser()
.getTimeZone();
MutableDateTime dtInicio = new MutableDateTime(dataInicio,
DateTimeZone.forTimeZone(tz));
dtInicio.setTime(0, 0, 0, 0);
Timestamp inicio = new Timestamp(dtInicio.getMillis());
MutableDateTime dtFim = new MutableDateTime(dataFim,
DateTimeZone.forTimeZone(tz));
dtFim.setTime(23, 59, 59, 999);
Timestamp fim = new Timestamp(dtFim.getMillis());
pstmt.setTimestamp(1, inicio);
pstmt.setTimestamp(2, fim);
}
return pstmt;
}
/**
* Consulta dentre os usuários da listaDadosUsuario especificada, quais são
* membros
*
* @param conn
* @param listaDadosUsuario
* lista de usuários que fizeram alguma participação na
* comunidade
* @param groupId
* comunidade a ser pesquisada
* @throws SQLException
* @throws SystemException
*/
private void consultaMembros(Connection conn,
Map<Long, DadosUsuarioDTO> listaDadosUsuario, Long groupId)
throws SQLException, SystemException {
String sql = " SELECT u.userId, u.firstname, u.middlename, u.lastname, u.emailaddress FROM users_groups ug JOIN user_ u ON u.userId = ug.userId WHERE ug.groupId = ? ";
PreparedStatement pstmt = conn.prepareStatement(sql);
try {
pstmt.setLong(1, groupId);
ResultSet rs = pstmt.executeQuery();
try {
while (rs.next()) {
long userId = rs.getInt(1);
if (listaDadosUsuario.containsKey(userId)) {
try {
BeanUtils.setProperty(
listaDadosUsuario.get(userId), "membro",
true);
} catch (IllegalAccessException e) {
throw new SystemException();
} catch (InvocationTargetException e) {
throw new SystemException();
}
} else {
StringBuilder sb = new StringBuilder();
String firstName = rs.getString(2);
String middleName = rs.getString(3);
String lastName = rs.getString(4);
String email = rs.getString(5);
if (firstName != null && !firstName.isEmpty())
sb.append(firstName).append(' ');
if (middleName != null && !middleName.isEmpty())
sb.append(middleName).append(' ');
if (lastName != null && !lastName.isEmpty())
sb.append(lastName);
DadosUsuarioDTO dadosUsuario = new DadosUsuarioDTO(userId, sb.toString().trim(), email);
dadosUsuario.setMembro(true);
listaDadosUsuario.put(userId, dadosUsuario);
}
}
} finally {
DataAccess.cleanUp(rs);
}
} finally {
DataAccess.cleanUp(pstmt);
}
}
}