/**
*
*/
package net.conselldemallorca.helium.core.helper;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import net.conselldemallorca.helium.core.model.hibernate.Domini;
import net.conselldemallorca.helium.core.model.hibernate.Entorn;
import net.conselldemallorca.helium.v3.core.api.dto.DominiDto;
import net.conselldemallorca.helium.v3.core.api.dto.EntornDto;
import net.conselldemallorca.helium.v3.core.api.dto.IntegracioAccioDto;
import net.conselldemallorca.helium.v3.core.api.dto.IntegracioAccioEstatEnumDto;
import net.conselldemallorca.helium.v3.core.api.dto.IntegracioAccioTipusEnumDto;
import net.conselldemallorca.helium.v3.core.api.dto.IntegracioParametreDto;
import net.conselldemallorca.helium.v3.core.repository.DominiRepository;
/**
* Mètodes per a la gestió d'integracions.
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Component
public class MonitorDominiHelper {
private static final int MAX_ACCIONS_PER_DOMINI = 20;
@Autowired
private DominiRepository dominiRepository;
private Map<Long, LinkedList<IntegracioAccioDto>> accionsDomini = new HashMap<Long, LinkedList<IntegracioAccioDto>>();
private Map<Long, Integer> maxAccionsDomini = new HashMap<Long, Integer>();
public synchronized List<DominiDto> findByEntorn(Entorn entorn) {
List<Domini> dominis;
if (entorn != null) {
dominis = dominiRepository.findByEntorn(
entorn);
} else {
dominis = dominiRepository.findAll();
}
List<DominiDto> dtos = new ArrayList<DominiDto>();
for (Domini domini: dominis) {
dtos.add(toDominiDto(domini));
}
return dtos;
}
public synchronized List<IntegracioAccioDto> findAccionsByDomini(
Long dominiId) {
return getLlistaAccions(dominiId);
}
public void addAccioOk(
Domini domini,
String descripcio,
IntegracioAccioTipusEnumDto tipus,
long tempsResposta,
IntegracioParametreDto ... parametres) {
addAccio(
domini,
descripcio,
tipus,
IntegracioAccioEstatEnumDto.OK,
tempsResposta,
null,
null,
parametres);
}
public void addAccioError(
Domini domini,
String descripcio,
IntegracioAccioTipusEnumDto tipus,
long tempsResposta,
String errorDescripcio,
IntegracioParametreDto ... parametres) {
addAccio(
domini,
descripcio,
tipus,
IntegracioAccioEstatEnumDto.ERROR,
tempsResposta,
errorDescripcio,
null,
parametres);
}
public void addAccioError(
Domini domini,
String descripcio,
IntegracioAccioTipusEnumDto tipus,
long tempsResposta,
String errorDescripcio,
Throwable throwable,
IntegracioParametreDto ... parametres) {
addAccio(
domini,
descripcio,
tipus,
IntegracioAccioEstatEnumDto.ERROR,
tempsResposta,
errorDescripcio,
throwable,
parametres);
}
private LinkedList<IntegracioAccioDto> getLlistaAccions(
Long dominiId) {
LinkedList<IntegracioAccioDto> accions = new LinkedList<IntegracioAccioDto>();
try {
accions = accionsDomini.get(dominiId);
if (accions == null) {
accions = new LinkedList<IntegracioAccioDto>();
accionsDomini.put(
dominiId,
accions);
} else {
int index = 0;
for (IntegracioAccioDto accio: accions) {
accio.setIndex(new Long(index++));
}
}
} catch (Exception ex) {
logger.error("ERROR MONITOR DOMINI - GetLlistaAccions: ", ex);
}
return accions;
}
private int getMaxAccions(
Domini domini) {
Long dominiId = domini.getId();
Integer max = maxAccionsDomini.get(dominiId);
if (max == null) {
max = new Integer(MAX_ACCIONS_PER_DOMINI);
maxAccionsDomini.put(
dominiId,
max);
}
return max.intValue();
}
private synchronized void addAccio(
Domini domini,
String descripcio,
IntegracioAccioTipusEnumDto tipus,
IntegracioAccioEstatEnumDto estat,
long tempsResposta,
String errorDescripcio,
Throwable throwable,
IntegracioParametreDto ... parametres) {
Long entornId = domini.getEntorn().getId();
IntegracioAccioDto accio = new IntegracioAccioDto();
accio.setEntornId(entornId);
accio.setIntegracioCodi(domini.getCodi());
accio.setData(new Date());
accio.setDescripcio(descripcio);
accio.setTipus(tipus);
accio.setEstat(estat);
accio.setTempsResposta(tempsResposta);
if (IntegracioAccioEstatEnumDto.ERROR.equals(estat)) {
accio.setErrorDescripcio(errorDescripcio);
if (throwable != null) {
accio.setExcepcioMessage(
ExceptionUtils.getMessage(throwable));
accio.setExcepcioStacktrace(
ExceptionUtils.getStackTrace(throwable));
}
}
if (parametres != null) {
accio.setParametres(
new ArrayList<IntegracioParametreDto>(Arrays.asList(parametres)));
}
LinkedList<IntegracioAccioDto> accions = getLlistaAccions(domini.getId());
int max = getMaxAccions(domini);
while (accions.size() >= max) {
accions.poll();
}
accions.add(accio);
}
private DominiDto toDominiDto(Domini domini) {
EntornDto entorn = new EntornDto();
entorn.setId(domini.getEntorn().getId());
entorn.setCodi(domini.getEntorn().getCodi());
entorn.setNom(domini.getEntorn().getNom());
DominiDto dto = new DominiDto(
domini.getCodi(),
domini.getNom(),
entorn);
dto.setId(domini.getId());
LinkedList<IntegracioAccioDto> accions = accionsDomini.get(domini.getId());
if (accions != null) {
int numErrors = 0;
for (IntegracioAccioDto accio: accions) {
if (accio.isEstatError())
numErrors++;
}
dto.setNumErrors(numErrors);
}
return dto;
}
private static final Logger logger = LoggerFactory.getLogger(MonitorDominiHelper.class);
}