/**
*
*/
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.springframework.stereotype.Component;
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.IntegracioDto;
import net.conselldemallorca.helium.v3.core.api.dto.IntegracioParametreDto;
/**
* Mètodes per a la gestió d'integracions.
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Component
public class MonitorIntegracioHelper {
public static final int MAX_ACCIONS_PER_INTEGRACIO = 20;
public static final String INTCODI_PERSONA = "PERSONA";
public static final String INTCODI_SISTRA = "SISTRA";
public static final String INTCODI_PFIRMA = "PFIRMA";
public static final String INTCODI_FIRMA = "FIRMA";
public static final String INTCODI_CUSTODIA = "CUSTODIA";
public static final String INTCODI_REGISTRE = "REGISTRE";
public static final String INTCODI_GESDOC = "GESDOC";
public static final String INTCODI_CONVDOC = "CONVDOC";
public static final String INTCODI_PFIRMA_CB = "PFIRMA_CB";
private Map<String, LinkedList<IntegracioAccioDto>> accionsIntegracio = new HashMap<String, LinkedList<IntegracioAccioDto>>();
private Map<String, Integer> maxAccionsIntegracio = new HashMap<String, Integer>();
public List<IntegracioDto> findAll() {
List<IntegracioDto> integracions = new ArrayList<IntegracioDto>();
integracions.add(
novaIntegracio(
INTCODI_PERSONA));
integracions.add(
novaIntegracio(
INTCODI_FIRMA));
integracions.add(
novaIntegracio(
INTCODI_PFIRMA));
integracions.add(
novaIntegracio(
INTCODI_PFIRMA_CB));
integracions.add(
novaIntegracio(
INTCODI_CUSTODIA));
integracions.add(
novaIntegracio(
INTCODI_REGISTRE));
integracions.add(
novaIntegracio(
INTCODI_SISTRA));
/*integracions.add(
novaIntegracio(
INTCODI_GESDOC));*/
integracions.add(
novaIntegracio(
INTCODI_CONVDOC));
for (IntegracioDto integracio: integracions) {
LinkedList<IntegracioAccioDto> accions = accionsIntegracio.get(integracio.getCodi());
if (accions != null) {
int numErrors = 0;
for (IntegracioAccioDto accio: accions) {
if (accio.isEstatError())
numErrors++;
}
integracio.setNumErrors(numErrors);
}
}
return integracions;
}
public List<IntegracioAccioDto> findAccionsByIntegracioCodi(
String integracioCodi) {
return getLlistaAccions(integracioCodi);
}
public void addAccioOk(
String integracioCodi,
String descripcio,
IntegracioAccioTipusEnumDto tipus,
long tempsResposta,
IntegracioParametreDto ... parametres) {
addAccio(
integracioCodi,
descripcio,
tipus,
IntegracioAccioEstatEnumDto.OK,
tempsResposta,
null,
null,
parametres);
}
public void addAccioError(
String integracioCodi,
String descripcio,
IntegracioAccioTipusEnumDto tipus,
long tempsResposta,
String errorDescripcio,
IntegracioParametreDto ... parametres) {
addAccio(
integracioCodi,
descripcio,
tipus,
IntegracioAccioEstatEnumDto.ERROR,
tempsResposta,
errorDescripcio,
null,
parametres);
}
public void addAccioError(
String integracioCodi,
String descripcio,
IntegracioAccioTipusEnumDto tipus,
long tempsResposta,
String errorDescripcio,
Throwable throwable,
IntegracioParametreDto ... parametres) {
addAccio(
integracioCodi,
descripcio,
tipus,
IntegracioAccioEstatEnumDto.ERROR,
tempsResposta,
errorDescripcio,
throwable,
parametres);
}
private LinkedList<IntegracioAccioDto> getLlistaAccions(
String integracioCodi) {
LinkedList<IntegracioAccioDto> accions = accionsIntegracio.get(integracioCodi);
if (accions == null) {
accions = new LinkedList<IntegracioAccioDto>();
accionsIntegracio.put(
integracioCodi,
accions);
} else {
int index = 0;
for (IntegracioAccioDto accio: accions) {
accio.setIndex(new Long(index++));
}
}
return accions;
}
private int getMaxAccions(
String integracioCodi) {
Integer max = maxAccionsIntegracio.get(integracioCodi);
if (max == null) {
max = new Integer(MAX_ACCIONS_PER_INTEGRACIO);
maxAccionsIntegracio.put(
integracioCodi,
max);
}
return max.intValue();
}
private void addAccio(
String integracioCodi,
String descripcio,
IntegracioAccioTipusEnumDto tipus,
IntegracioAccioEstatEnumDto estat,
long tempsResposta,
String errorDescripcio,
Throwable throwable,
IntegracioParametreDto ... parametres) {
IntegracioAccioDto accio = new IntegracioAccioDto();
accio.setIntegracioCodi(integracioCodi);
accio.setData(new Date());
accio.setDescripcio(descripcio);
accio.setTempsResposta(tempsResposta);
accio.setTipus(tipus);
accio.setEstat(estat);
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(integracioCodi);
int max = getMaxAccions(integracioCodi);
while (accions.size() >= max) {
accions.poll();
}
accions.add(accio);
}
private IntegracioDto novaIntegracio(
String codi) {
IntegracioDto integracio = new IntegracioDto();
integracio.setCodi(codi);
if (INTCODI_REGISTRE.equals(codi)) {
integracio.setDescripcio("REGWEB");
} else if (INTCODI_FIRMA.equals(codi)) {
integracio.setDescripcio("Firma digital");
} else if (INTCODI_PFIRMA.equals(codi)) {
integracio.setDescripcio("Portafib");
} else if (INTCODI_CUSTODIA.equals(codi)) {
integracio.setDescripcio("Custòdia");
} else if (INTCODI_GESDOC.equals(codi)) {
integracio.setDescripcio("Gestió doc.");
} else if (INTCODI_CONVDOC.equals(codi)) {
integracio.setDescripcio("Conversió doc.");
} else if (INTCODI_PERSONA.equals(codi)) {
integracio.setDescripcio("SEYCON");
} else if (INTCODI_SISTRA.equals(codi)) {
integracio.setDescripcio("SISTRA");
} else if (INTCODI_PFIRMA_CB.equals(codi)) {
integracio.setDescripcio("Portafib CB");
}
return integracio;
}
}