package br.gov.mj.sislegis.app.service.ejbs.crons; import java.io.IOException; import java.text.MessageFormat; import java.util.Iterator; import java.util.List; import java.util.ResourceBundle; import java.util.concurrent.Future; import java.util.logging.Level; import java.util.logging.Logger; import javax.ejb.AsyncResult; import javax.ejb.Asynchronous; import javax.ejb.Schedule; import javax.ejb.Singleton; import javax.inject.Inject; import org.apache.commons.mail.EmailException; import br.gov.mj.sislegis.app.model.Proposicao; import br.gov.mj.sislegis.app.model.Usuario; import br.gov.mj.sislegis.app.service.ProposicaoService; import br.gov.mj.sislegis.app.service.UsuarioService; import br.gov.mj.sislegis.app.service.WatchProposicaoService; import br.gov.mj.sislegis.app.util.SislegisUtil; /** * Executa monitoramento de proposicao * * @author rafael.coutinho * */ @Singleton public class WatchProposicaoEjb implements WatchProposicaoService { @Inject ProposicaoService proposicaoService; @Inject UsuarioService usuarioService; @Override @Schedule(hour = "*", persistent = false, info = "Atualiza status proposicoes") public void atualizaProposicoesSeguidas() { Logger.getLogger(SislegisUtil.SISLEGIS_LOGGER).fine("Atualizando proposicoes seguidas"); List<Proposicao> proposicoesSeguidas = proposicaoService.listProposicoesSeguidas(); for (Iterator<Proposicao> iterator = proposicoesSeguidas.iterator(); iterator.hasNext();) { Proposicao proposicao = (Proposicao) iterator.next(); try { if (proposicaoService.syncDadosProposicao(proposicao)) { notifyUsuariosProposicaoMudou(proposicao); } } catch (IOException e) { Logger.getLogger(SislegisUtil.SISLEGIS_LOGGER).log(Level.SEVERE, "Falhou ao atualizar proposicao " + proposicao.getSigla(), e); } } } /** * Envia email notificando da alteração de pauta para todos os seguidores de * uma comissão * * @param agenda * @return */ @Asynchronous public Future<String> notifyUsuariosProposicaoMudou(Proposicao proposicao) { String status = ""; ResourceBundle res = ResourceBundle.getBundle("messages"); String assunto = MessageFormat.format(res.getString("email.mudanca_proposicao.assunto"), proposicao.getSigla()); List<Usuario> seguidores = usuarioService.listUsuariosSeguidoresDeProposicao(proposicao); if (seguidores != null && !seguidores.isEmpty()) { for (Iterator<Usuario> iterator = seguidores.iterator(); iterator.hasNext();) { Usuario usuario = (Usuario) iterator.next(); Logger.getLogger(SislegisUtil.SISLEGIS_LOGGER).info("Notificando " + usuario.getEmail()); String body = MessageFormat.format(res.getString("email.mudanca_proposicao.body"), usuario.getNome(), proposicao.getSigla(), proposicao.getLastAlteracoesProposicao().getDescricaoAlteracao(), proposicao.getLinkProposicao()); try { SislegisUtil.sendEmail(usuario.getEmail(), usuario.getNome(), assunto, body); } catch (EmailException e) { Logger.getLogger(SislegisUtil.SISLEGIS_LOGGER).log(Level.SEVERE, "Erro ao enviar email para " + usuario.getEmail(), e); } } status = "OK+"; } else { Logger.getLogger(SislegisUtil.SISLEGIS_LOGGER).warning( "Nenhum usuário seguindo a proposicao " + proposicao.getSigla()); status = "OK"; } return new AsyncResult<String>(status); } }