/**
*
*/
package net.conselldemallorca.helium.v3.core.service;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import javax.annotation.Resource;
import net.conselldemallorca.helium.core.helper.ConversioTipusHelper;
import net.conselldemallorca.helium.core.helper.HibernateHelper;
import net.conselldemallorca.helium.core.helper.MailHelper;
import net.conselldemallorca.helium.core.helper.MonitorDominiHelper;
import net.conselldemallorca.helium.core.helper.MonitorIntegracioHelper;
import net.conselldemallorca.helium.core.helperv26.MesuresTemporalsHelper;
import net.conselldemallorca.helium.core.model.hibernate.Domini;
import net.conselldemallorca.helium.core.model.hibernate.Entorn;
import net.conselldemallorca.helium.core.model.hibernate.Persona;
import net.conselldemallorca.helium.core.model.hibernate.Reassignacio;
import net.conselldemallorca.helium.core.model.hibernate.UsuariPreferencies;
import net.conselldemallorca.helium.core.util.GlobalProperties;
import net.conselldemallorca.helium.v3.core.api.dto.ArxiuDto;
import net.conselldemallorca.helium.v3.core.api.dto.DominiDto;
import net.conselldemallorca.helium.v3.core.api.dto.IntegracioAccioDto;
import net.conselldemallorca.helium.v3.core.api.dto.IntegracioDto;
import net.conselldemallorca.helium.v3.core.api.dto.MesuraTemporalDto;
import net.conselldemallorca.helium.v3.core.api.dto.PersonaDto;
import net.conselldemallorca.helium.v3.core.api.dto.PersonaDto.Sexe;
import net.conselldemallorca.helium.v3.core.api.dto.ReassignacioDto;
import net.conselldemallorca.helium.v3.core.api.dto.TascaCompleteDto;
import net.conselldemallorca.helium.v3.core.api.dto.UsuariPreferenciesDto;
import net.conselldemallorca.helium.v3.core.api.exception.NoTrobatException;
import net.conselldemallorca.helium.v3.core.api.service.AdminService;
import net.conselldemallorca.helium.v3.core.repository.DominiRepository;
import net.conselldemallorca.helium.v3.core.repository.EntornRepository;
import net.conselldemallorca.helium.v3.core.repository.PersonaRepository;
import net.conselldemallorca.helium.v3.core.repository.ReassignacioRepository;
import net.conselldemallorca.helium.v3.core.repository.UsuariPreferenciesRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.json.MetricsModule;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* Servei per gestionar la configuració de l'aplicació.
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Service
public class AdminServiceImpl implements AdminService {
@Resource
private EntornRepository entornRepository;
@Resource
private DominiRepository dominiRepository;
@Resource
private ReassignacioRepository reassignacioRepository;
@Resource
private UsuariPreferenciesRepository usuariPreferenciesRepository;
@Resource
private PersonaRepository personaRepository;
@Resource
private HibernateHelper hibernateHelper;
@Resource
private ConversioTipusHelper conversioTipusHelper;
@Resource
private MesuresTemporalsHelper mesuresTemporalsHelper;
@Resource
private MonitorIntegracioHelper monitorIntegracioHelper;
@Resource
private MonitorDominiHelper monitorDominiHelper;
@Resource
private MailHelper mailHelper;
@Autowired
private MetricRegistry metricRegistry;
/**
* {@inheritDoc}
*/
@Override
public String getMetrics() {
logger.debug("Consultant les mètriques de l'aplicació");
try {
return getApplictionMetrics();
} catch (Exception ex) {
logger.error("Error al generar les mètriques de l'aplicació", ex);
return "ERR";
}
}
/**
* {@inheritDoc}
*/
@Override
@Scheduled(cron="0 30 23 * * *")
public void metricsEmailResponsables() {
logger.debug("Enviant email amb les mètriques de l'aplicació");
String destinataris = getCorreuMetriquesDestinataris();
if (destinataris != null && !destinataris.isEmpty()) {
try {
List<String> recipients = new ArrayList<String>();
for (String recipient: destinataris.split(",")) {
recipients.add(recipient.trim());
}
String fromAddress = getCorreuRemitent();
List<ArxiuDto> attachments = new ArrayList<ArxiuDto>();
attachments.add(
new ArxiuDto(
"metrics.json",
getApplictionMetrics().getBytes()));
mailHelper.send(
fromAddress,
recipients,
null,
null,
"Mètriques Helium " + new SimpleDateFormat("dd/MM/yyyy").format(new Date()),
"Mètriques generades per a monitoritzar l'ús de l'aplicació.",
attachments);
} catch (Exception ex) {
logger.error("Error al enviar per correu les mètriques de l'aplicació", ex);
}
}
}
/**
* {@inheritDoc}
*/
@Override
public List<IntegracioDto> monitorIntegracioFindAll() {
logger.debug("Consultant la llista d'integracions disponibles");
return monitorIntegracioHelper.findAll();
}
/**
* {@inheritDoc}
*/
@Override
public List<IntegracioAccioDto> monitorIntegracioFindAccionsByIntegracio(
String integracioCodi) {
logger.debug("Consultant la llista d'accions per a la integració (" +
"integracioCodi=" + integracioCodi + ")");
return monitorIntegracioHelper.findAccionsByIntegracioCodi(integracioCodi);
}
/**
* {@inheritDoc}
*/
@Override
public List<DominiDto> monitorDominiFindByEntorn(
Long entornId) {
logger.debug("Consultant la llista de dominis donat un entorn (" +
"entornId=" + entornId + ")");
Entorn entorn = null;
if (entornId != null) {
entorn = entornRepository.findOne(entornId);
if (entorn == null) {
throw new NoTrobatException(Entorn.class,entornId);
}
}
return monitorDominiHelper.findByEntorn(entorn);
}
/**
* {@inheritDoc}
*/
@Override
public List<IntegracioAccioDto> monitorDominiFindAccionsByDomini(
Long dominiId) {
logger.debug("Consultant la llista d'accions per al domini (" +
"dominiId=" + dominiId + ")");
if (dominiId != 0L) {
// Domini no intern
Domini domini = dominiRepository.findOne(dominiId);
if (domini == null) {
throw new NoTrobatException(Domini.class,dominiId);
}
}
return monitorDominiHelper.findAccionsByDomini(dominiId);
}
/**
* {@inheritDoc}
*/
@Override
public List<MesuraTemporalDto> mesuraTemporalFindByFamilia(
String familia,
boolean ambDetall) {
logger.debug("Consultant el llistat de mesures temporals per família (" +
"familia=" + familia + ", " +
"ambDetall=" + ambDetall + ")");
return mesuresTemporalsHelper.getEstadistiques(familia, ambDetall);
}
/**
* {@inheritDoc}
*/
@Override
public List<MesuraTemporalDto> mesuraTemporalFindByTipusExpedient() {
logger.debug("Consultant el llistat de mesures temporals dels tipus d'expedient");
return mesuresTemporalsHelper.getEstadistiquesTipusExpedient();
}
/**
* {@inheritDoc}
*/
@Override
public List<MesuraTemporalDto> mesuraTemporalFindByTasca() {
logger.debug("Consultant el llistat de mesures temporals de les tasques");
return mesuresTemporalsHelper.getEstadistiquesTasca();
}
/**
* {@inheritDoc}
*/
@Override
public Set<String> mesuraTemporalFindFamiliesAll() {
logger.debug("Consultant el llistat de famílies de mesures temporals");
return mesuresTemporalsHelper.getIntervalsFamilia();
}
/**
* {@inheritDoc}
*/
@Override
public void mesuraTemporalIniciar(
String clau,
String familia) {
logger.debug("Consultant el llistat de famílies de mesures temporals");
mesuresTemporalsHelper.mesuraIniciar(
clau,
familia);
}
/**
* {@inheritDoc}
*/
@Override
public void mesuraTemporalIniciar(
String clau,
String familia,
String tipusExpedient) {
mesuresTemporalsHelper.mesuraIniciar(
clau,
familia,
tipusExpedient);
}
/**
* {@inheritDoc}
*/
@Override
public void mesuraTemporalIniciar(
String clau,
String familia,
String tipusExpedient,
String tasca,
String detall) {
mesuresTemporalsHelper.mesuraIniciar(
clau,
familia,
tipusExpedient,
tasca,
detall);
}
@Override
public void mesuraTemporalCalcular(
String clau,
String familia) {
mesuresTemporalsHelper.mesuraCalcular(
clau,
familia);
}
@Override
public void mesuraTemporalCalcular(
String clau,
String familia,
String tipusExpedient) {
mesuresTemporalsHelper.mesuraCalcular(
clau,
familia,
tipusExpedient);
}
@Override
public void mesuraTemporalCalcular(
String clau,
String familia,
String tipusExpedient,
String tasca,
String detall) {
mesuresTemporalsHelper.mesuraCalcular(
clau,
familia,
tipusExpedient,
tasca,
detall);
}
@Override
public boolean mesuraTemporalIsActive() {
return MesuresTemporalsHelper.isActiu();
}
@Override
public boolean isStatisticActive() {
return hibernateHelper.isStatisticActive();
}
@Override
public List<MesuraTemporalDto> getHibernateStatistics(
String familia,
boolean exportar) {
return hibernateHelper.getHibernateStatistics(familia, exportar);
}
@Override
public List<TascaCompleteDto> getTasquesCompletar() {
return mesuresTemporalsHelper.getTasquesCompletar();
}
@Transactional
@Override
public void updatePerfil(UsuariPreferenciesDto preferencies) {
UsuariPreferencies usuari = usuariPreferenciesRepository.findByCodi(preferencies.getCodi());
if (usuari == null)
usuari = new UsuariPreferencies();
usuari.setCodi(preferencies.getCodi());
usuari.setCabeceraReducida(preferencies.isCabeceraReducida());
usuari.setConsultaId(preferencies.getConsultaId());
usuari.setExpedientTipusDefecteId(preferencies.getExpedientTipusDefecteId());
usuari.setDefaultEntornCodi(preferencies.getDefaultEntornCodi());
usuari.setFiltroTareasActivas(preferencies.isFiltroTareasActivas());
usuari.setListado(preferencies.getListado());
usuari.setNumElementosPagina(preferencies.getNumElementosPagina());
usuariPreferenciesRepository.save(usuari);
}
@Transactional
@Override
public void updatePersona(PersonaDto personaDto) {
Persona persona = personaRepository.findByCodi(personaDto.getCodi());
persona.setDni(personaDto.getDni());
persona.setEmail(personaDto.getEmail());
persona.setLlinatge1(personaDto.getLlinatge1());
persona.setLlinatge2(personaDto.getLlinatge2());
persona.setNom(personaDto.getNom());
persona.setSexe(personaDto.getSexe().equals(Sexe.SEXE_HOME) ? Persona.Sexe.SEXE_HOME : Persona.Sexe.SEXE_DONA);
personaRepository.save(persona);
}
@Transactional(readOnly = true)
@Override
public List<ReassignacioDto> llistaReassignacions() {
return conversioTipusHelper.convertirList(reassignacioRepository.findLlistaActius(Calendar.getInstance().getTime()), ReassignacioDto.class);
}
@Transactional
@Override
public void createReassignacio(
String usuariOrigen,
String usuariDesti,
Date dataInici,
Date dataFi,
Date dataCancelacio,
Long tipusExpedientId) {
Reassignacio reassignacio = new Reassignacio();
reassignacio.setUsuariOrigen(usuariOrigen);
reassignacio.setUsuariDesti(usuariDesti);
reassignacio.setDataInici(dataInici);
reassignacio.setDataFi(dataFi);
reassignacio.setDataCancelacio(dataCancelacio);
reassignacio.setTipusExpedientId(tipusExpedientId);
reassignacioRepository.save(reassignacio);
}
@Transactional
@Override
public void updateReassignacio(
Long id,
String usuariOrigen,
String usuariDesti,
Date dataInici,
Date dataFi,
Date dataCancelacio,
Long tipusExpedientId) {
Reassignacio reassignacio = reassignacioRepository.findOne(id);
reassignacio.setUsuariOrigen(usuariOrigen);
reassignacio.setUsuariDesti(usuariDesti);
reassignacio.setDataInici(dataInici);
reassignacio.setDataFi(dataFi);
reassignacio.setDataCancelacio(dataCancelacio);
reassignacio.setTipusExpedientId(tipusExpedientId);
reassignacioRepository.save(reassignacio);
}
@Transactional
@Override
public void deleteReassignacio(Long id) {
Reassignacio reassignacio = reassignacioRepository.findOne(id);
if (reassignacio != null) {
reassignacio.setDataCancelacio(Calendar.getInstance().getTime());
reassignacioRepository.save(reassignacio);
}
}
@Transactional(readOnly = true)
@Override
public ReassignacioDto findReassignacioById(Long id) {
return conversioTipusHelper.convertir(reassignacioRepository.findOne(id), ReassignacioDto.class);
}
private String getApplictionMetrics() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(
new MetricsModule(
TimeUnit.SECONDS,
TimeUnit.MILLISECONDS,
false));
return mapper.writeValueAsString(metricRegistry);
}
private String getCorreuRemitent() {
return GlobalProperties.getInstance().getProperty("app.correu.remitent");
}
private String getCorreuMetriquesDestinataris() {
return GlobalProperties.getInstance().getProperty("app.correu.metrics.recipients");
}
private static final Logger logger = LoggerFactory.getLogger(AdminServiceImpl.class);
}