/**
*
*/
package net.conselldemallorca.helium.core.model.service;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import com.codahale.metrics.MetricRegistry;
import net.conselldemallorca.helium.core.common.JbpmVars;
import net.conselldemallorca.helium.core.helperv26.DocumentHelper;
import net.conselldemallorca.helium.core.model.dao.AlertaDao;
import net.conselldemallorca.helium.core.model.dao.CampDao;
import net.conselldemallorca.helium.core.model.dao.ConsultaCampDao;
import net.conselldemallorca.helium.core.model.dao.DefinicioProcesDao;
import net.conselldemallorca.helium.core.model.dao.DocumentStoreDao;
import net.conselldemallorca.helium.core.model.dao.ExpedientDao;
import net.conselldemallorca.helium.core.model.dao.LuceneDao;
import net.conselldemallorca.helium.core.model.dao.PluginCustodiaDao;
import net.conselldemallorca.helium.core.model.dao.PluginPersonaDao;
import net.conselldemallorca.helium.core.model.dao.PluginPortasignaturesDao;
import net.conselldemallorca.helium.core.model.dao.PluginTramitacioDao;
import net.conselldemallorca.helium.core.model.dao.RegistreDao;
import net.conselldemallorca.helium.core.model.dao.UsuariDao;
import net.conselldemallorca.helium.core.model.dto.DocumentDto;
import net.conselldemallorca.helium.core.model.dto.PersonaDto;
import net.conselldemallorca.helium.core.model.exception.IllegalStateException;
import net.conselldemallorca.helium.core.model.exception.IncidentThrowsAdviceHelper;
import net.conselldemallorca.helium.core.model.exception.PluginException;
import net.conselldemallorca.helium.core.model.hibernate.Alerta;
import net.conselldemallorca.helium.core.model.hibernate.DocumentStore;
import net.conselldemallorca.helium.core.model.hibernate.Expedient;
import net.conselldemallorca.helium.core.model.hibernate.ExpedientLog.ExpedientLogAccioTipus;
import net.conselldemallorca.helium.core.model.hibernate.Portasignatures;
import net.conselldemallorca.helium.core.model.hibernate.Portasignatures.TipusEstat;
import net.conselldemallorca.helium.core.model.hibernate.Portasignatures.Transicio;
import net.conselldemallorca.helium.core.model.hibernate.Usuari;
import net.conselldemallorca.helium.core.security.AclServiceDao;
import net.conselldemallorca.helium.core.util.GlobalProperties;
import net.conselldemallorca.helium.integracio.plugins.tramitacio.DadesTramit;
import net.conselldemallorca.helium.integracio.plugins.tramitacio.DadesVistaDocument;
import net.conselldemallorca.helium.integracio.plugins.tramitacio.ObtenirDadesTramitRequest;
import net.conselldemallorca.helium.integracio.plugins.tramitacio.ObtenirVistaDocumentRequest;
import net.conselldemallorca.helium.integracio.plugins.tramitacio.PublicarEventRequest;
import net.conselldemallorca.helium.integracio.plugins.tramitacio.PublicarExpedientRequest;
import net.conselldemallorca.helium.integracio.plugins.tramitacio.ResultatProcesTramitRequest;
import net.conselldemallorca.helium.jbpm3.integracio.JbpmHelper;
import net.conselldemallorca.helium.jbpm3.integracio.JbpmProcessInstance;
import net.conselldemallorca.helium.jbpm3.integracio.JbpmToken;
/**
* Servei per gestionar les consultes als plugins
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Service
public class PluginService {
private PluginPersonaDao pluginPersonaDao;
private PluginPortasignaturesDao pluginPortasignaturesDao;
private PluginCustodiaDao pluginCustodiaDao;
private PluginTramitacioDao pluginTramitacioDao;
private UsuariDao usuariDao;
private ExpedientDao expedientDao;
private RegistreDao registreDao;
private DocumentStoreDao documentStoreDao;
private JbpmHelper jbpmDao;
private DocumentHelper documentHelper;
private ExpedientLogHelper expedientLogHelper;
private DefinicioProcesDao definicioProcesDao;
private CampDao campDao;
private ConsultaCampDao consultaCampDao;
private AlertaDao alertaDao;
private LuceneDao luceneDao;
private DtoConverter dtoConverter;
private AclServiceDao aclServiceDao;
private ServiceUtils serviceUtils;
private MessageSource messageSource;
private MetricRegistry metricRegistry;
public List<PersonaDto> findPersonaLikeNomSencer(String text) {
return pluginPersonaDao.findLikeNomSencerPlugin(text);
}
public PersonaDto findPersonaAmbCodi(String codi) {
return pluginPersonaDao.findAmbCodiPlugin(codi);
}
@Scheduled(fixedRate = 86400000)
public void personesSync() {
if (isSyncPersonesActiu()) {
List<PersonaDto> persones = pluginPersonaDao.findAllPlugin();
int nsyn = 0;
int ncre = 0;
logger.info("Inici de la sincronització de persones (" + persones.size() + " registres)");
for (PersonaDto persona: persones) {
try {
net.conselldemallorca.helium.core.model.hibernate.Persona p = pluginPersonaDao.findAmbCodi(persona.getCodi());
if (p != null) {
p.setNom(persona.getNom());
p.setLlinatges(persona.getLlinatges());
p.setDni(persona.getDni());
p.setEmail(persona.getEmail());
} else {
p = new net.conselldemallorca.helium.core.model.hibernate.Persona();
String codiPerCreacio = (isIgnoreCase()) ? persona.getCodi().toLowerCase() : persona.getCodi();
p.setCodi(codiPerCreacio);
p.setNom(persona.getNom());
p.setLlinatge1((persona.getLlinatge1() != null) ? persona.getLlinatge1(): " ");
p.setLlinatge2(persona.getLlinatge2());
p.setDni(persona.getDni());
p.setEmail(persona.getEmail());
pluginPersonaDao.saveOrUpdate(p);
pluginPersonaDao.flush();
Usuari usuari = usuariDao.getById(codiPerCreacio, false);
if (usuari == null) {
usuari = new Usuari();
usuari.setCodi(codiPerCreacio);
usuari.setContrasenya(codiPerCreacio);
usuariDao.saveOrUpdate(usuari);
usuariDao.flush();
}
ncre++;
}
} catch (Exception ex) {
logger.error("Error en la importació de la persona amb codi " + persona.getCodi(), ex);
}
nsyn++;
}
logger.info("Fi de la sincronització de persones (processades: " + nsyn + ", creades: " + ncre + ")");
}
}
public void enviarPortasignatures(
Long documentId,
List<Long> annexosId,
PersonaDto persona,
List<PersonaDto> personesPas1,
int minSignatarisPas1,
List<PersonaDto> personesPas2,
int minSignatarisPas2,
List<PersonaDto> personesPas3,
int minSignatarisPas3,
Expedient expedient,
String importancia,
Date dataLimit,
Long tokenId,
Long processInstanceId,
String transicioOK,
String transicioKO) throws PluginException {
try {
DocumentDto document = documentHelper.getDocumentVista(
documentId,
true,
true);
List<DocumentDto> annexos = null;
if (annexosId != null) {
annexos = new ArrayList<DocumentDto>();
for (Long docId: annexosId) {
DocumentDto docDto = documentHelper.getDocumentVista(
docId,
false,
false);
if (docDto != null){
annexos.add(docDto);
}
}
}
Integer doc = pluginPortasignaturesDao.uploadDocument(
document,
annexos,
persona,
personesPas1,
minSignatarisPas1,
personesPas2,
minSignatarisPas2,
personesPas3,
minSignatarisPas3,
expedient,
importancia,
dataLimit);
IncidentThrowsAdviceHelper.addDadesAdvicePortasignatures(doc);
Calendar cal = Calendar.getInstance();
Portasignatures portasignatures = new Portasignatures();
portasignatures.setDocumentId(doc);
portasignatures.setTokenId(tokenId);
portasignatures.setDataEnviat(cal.getTime());
portasignatures.setEstat(TipusEstat.PENDENT);
portasignatures.setDocumentStoreId(documentId);
portasignatures.setTransicioOK(transicioOK);
portasignatures.setTransicioKO(transicioKO);
portasignatures.setExpedient(expedient);
portasignatures.setProcessInstanceId(processInstanceId.toString());
pluginPortasignaturesDao.saveOrUpdate(portasignatures);
} catch (Exception e) {
throw new PluginException(getServiceUtils().getMessage("error.pluginService.pujarDocument"), e);
}
}
public void deletePortasignatures(
List<Integer> documentsId) throws PluginException {
pluginPortasignaturesDao.deleteDocuments(documentsId);
}
public boolean processarDocumentCallbackPortasignatures(
Integer id,
boolean rebujat,
String motiuRebuig) {
try {
Portasignatures portasignatures = pluginPortasignaturesDao.findByDocument(id);
if (portasignatures != null) {
if (TipusEstat.PENDENT.equals(portasignatures.getEstat())) {
portasignatures.setDataSignatRebutjat(new Date());
if (!rebujat) {
portasignatures.setEstat(TipusEstat.SIGNAT);
portasignatures.setTransition(Transicio.SIGNAT);
} else {
portasignatures.setEstat(TipusEstat.REBUTJAT);
portasignatures.setTransition(Transicio.REBUTJAT);
portasignatures.setMotiuRebuig(motiuRebuig);
}
pluginPortasignaturesDao.saveOrUpdate(portasignatures);
processarDocumentPendentPortasignatures(id, portasignatures);
return true;
} else if (TipusEstat.ESBORRAT.equals(portasignatures.getEstat())) {
return true;
} else if (TipusEstat.PROCESSAT.equals(portasignatures.getEstat())) {
return true;
} else {
logger.error("El document rebut al callback (id=" + id + ") no està pendent del callback, el seu estat és " + portasignatures.getEstat());
}
} else {
logger.error("El document rebut al callback (id=" + id + ") no s'ha trobat entre els documents enviats al portasignatures");
}
} catch (Exception ex) {
logger.error("El document rebut al callback (id=" + id + ") ha produit una excepció al ser processat: " + ex.getMessage());
logger.debug("El document rebut al callback (id=" + id + ") ha produit una excepció al ser processat", ex);
}
return false;
}
public boolean processarDocumentPendentPortasignatures(Integer id) {
return processarDocumentPendentPortasignatures(
id,
pluginPortasignaturesDao.findByDocument(id));
}
/*public Double processarDocumentSignatPortasignatures(Integer id) {
Double resposta = -1D;
Portasignatures portasignatures = pluginPortasignaturesDao.findByDocument(id);
if (portasignatures != null) {
Date ara = new Date();
if (portasignatures.getDataCallbackPrimer() == null)
portasignatures.setDataCallbackPrimer(ara);
portasignatures.setDataCallbackDarrer(ara);
Long tokenId = portasignatures.getTokenId();
JbpmToken token = jbpmDao.getTokenById(tokenId.toString());
DocumentStore documentStore = documentStoreDao.getById(portasignatures.getDocumentStoreId(), false);
if (documentStore != null) {
if (!TipusEstat.PENDENT.equals(portasignatures.getEstat())) {
logger.warn("El document rebut al callback (id=" + id + ") no està en estat PENDENT (estat=" + portasignatures.getEstat() + ")");
String nodeName = token.getNodeName();
String nodeClass = token.getNodeClass();
logger.info("El document rebut al callback (id=" + id + ") té el token en el node (name=" + nodeName + ", class=" + nodeClass + ")");
enviarCorreuErrorPsigna(
"El document rebut al callback (id=" + id + ") no està en estat PENDENT",
"L'estat actual és: " + portasignatures.getEstat(),
null);
}
try {
expedientLogHelper.afegirLogExpedientPerProces(
token.getProcessInstanceId(),
ExpedientLogAccioTipus.PROCES_DOCUMENT_SIGNAR,
new Boolean(true).toString());
afegirDocumentCustodia(
portasignatures.getDocumentId(),
portasignatures.getDocumentStoreId());
portasignatures.setEstat(TipusEstat.SIGNAT);
portasignatures.setTransition(Transicio.SIGNAT);
jbpmDao.signalToken(
tokenId.longValue(),
portasignatures.getTransicioOK());
getServiceUtils().expedientIndexLuceneUpdate(
jbpmDao.getTokenById(tokenId.toString()).getProcessInstanceId());
resposta = 1D;
} catch (PluginException pex) {
portasignatures.setErrorCallbackProcessant(getMissageFinalCadenaExcepcions(pex));
logger.error("Error al processar el document pel callback (id=" + id + "): " + getMissageFinalCadenaExcepcions(pex), pex);
enviarCorreuErrorPsigna(
"Error al processar el document pel callback (id=" + id + ")",
"S'ha produit un error al custodiar el document:",
pex);
} catch (Exception ex) {
portasignatures.setErrorCallbackProcessant(getMissageFinalCadenaExcepcions(ex));
logger.error("Error al processar el document pel callback (id=" + id + ")", ex);
enviarCorreuErrorPsigna(
"Error al processar el document pel callback (id=" + id + ")",
"S'ha produit un error:",
ex);
}
pluginPortasignaturesDao.saveOrUpdate(portasignatures);
} else {
logger.error("El document rebut al callback (id=" + id + ") fa referència a un documentStore inexistent (id=" + portasignatures.getDocumentStoreId() + ")");
enviarCorreuErrorPsigna(
"El document rebut al callback (id=" + id + ") fa referència a un documentStore inexistent (id=" + portasignatures.getDocumentStoreId() + ")",
"",
null);
}
} else {
logger.error("El document rebut al callback (id=" + id + ") no s'ha trobat entre els documents enviats al portasignatures");
enviarCorreuErrorPsigna(
"El document rebut al callback (id=" + id + ") no s'ha trobat entre els documents enviats al portasignatures",
"",
null);
}
return resposta;
}
public Double processarDocumentRebutjatPortasignatures(Integer id, String motiuRebuig) {
Double resposta = -1D;
Portasignatures portasignatures = pluginPortasignaturesDao.findByDocument(id);
if (portasignatures != null) {
Long tokenId = portasignatures.getTokenId();
JbpmToken token = jbpmDao.getTokenById(tokenId.toString());
expedientLogHelper.afegirLogExpedientPerProces(
token.getProcessInstanceId(),
ExpedientLogAccioTipus.PROCES_DOCUMENT_SIGNAR,
new Boolean(false).toString());
portasignatures.setEstat(TipusEstat.REBUTJAT);
portasignatures.setTransition(Transicio.REBUTJAT);
portasignatures.setMotiuRebuig(motiuRebuig);
pluginPortasignaturesDao.saveOrUpdate(portasignatures);
jbpmDao.signalToken(
tokenId.longValue(),
portasignatures.getTransicioKO());
getServiceUtils().expedientIndexLuceneUpdate(
token.getProcessInstanceId());
resposta = 1D;
} else {
logger.error("El document rebut al callback (id=" + id + ") no s'ha trobat en els documents pendents pel portasignatures");
}
return resposta;
}*/
public void publicarExpedient(
PublicarExpedientRequest request) {
pluginTramitacioDao.publicarExpedient(request);
}
public void publicarEvent(
PublicarEventRequest request) {
pluginTramitacioDao.publicarEvent(request);
}
public DadesTramit obtenirDadesTramit(
ObtenirDadesTramitRequest request) {
return pluginTramitacioDao.obtenirDadesTramit(request);
}
public DadesVistaDocument obtenirVistaDocument(
ObtenirVistaDocumentRequest request) {
return pluginTramitacioDao.obtenirVistaDocument(request);
}
public void comunicarResultatProcesTramit(
ResultatProcesTramitRequest request) {
pluginTramitacioDao.comunicarResultatProcesTramit(request);
}
@Autowired
public void setPluginPersonaDao(PluginPersonaDao pluginPersonaDao) {
this.pluginPersonaDao = pluginPersonaDao;
}
@Autowired
public void setUsuariDao(UsuariDao usuariDao) {
this.usuariDao = usuariDao;
}
@Autowired
public void setPluginPortasignaturesDao(
PluginPortasignaturesDao pluginPortasignaturesDao) {
this.pluginPortasignaturesDao = pluginPortasignaturesDao;
}
@Autowired
public void setPluginCustodiaDao(PluginCustodiaDao pluginCustodiaDao) {
this.pluginCustodiaDao = pluginCustodiaDao;
}
@Autowired
public void setPluginTramitacioDao(PluginTramitacioDao pluginTramitacioDao) {
this.pluginTramitacioDao = pluginTramitacioDao;
}
@Autowired
public void setExpedientDao(ExpedientDao expedientDao) {
this.expedientDao = expedientDao;
}
@Autowired
public void setRegistreDao(RegistreDao registreDao) {
this.registreDao = registreDao;
}
@Autowired
public void setDocumentStoreDao(DocumentStoreDao documentStoreDao) {
this.documentStoreDao = documentStoreDao;
}
@Autowired
public void setDocumentHelper(DocumentHelper documentHelper) {
this.documentHelper = documentHelper;
}
@Autowired
public void setExpedientLogHelper(ExpedientLogHelper expedientLogHelper) {
this.expedientLogHelper = expedientLogHelper;
}
@Autowired
public void setJbpmHelper(JbpmHelper jbpmDao) {
this.jbpmDao = jbpmDao;
}
@Autowired
public void setDefinicioProcesDao(DefinicioProcesDao definicioProcesDao) {
this.definicioProcesDao = definicioProcesDao;
}
@Autowired
public void setCampDao(CampDao campDao) {
this.campDao = campDao;
}
@Autowired
public void setConsultaCampDao(ConsultaCampDao consultaCampDao) {
this.consultaCampDao = consultaCampDao;
}
@Autowired
public void setAlertaDao(AlertaDao alertaDao) {
this.alertaDao = alertaDao;
}
@Autowired
public void setLuceneDao(LuceneDao luceneDao) {
this.luceneDao = luceneDao;
}
@Autowired
public void setDtoConverter(DtoConverter dtoConverter) {
this.dtoConverter = dtoConverter;
}
@Autowired
public void setAclServiceDao(AclServiceDao aclServiceDao) {
this.aclServiceDao = aclServiceDao;
}
@Autowired
public void setMessageSource(MessageSource messageSource) {
this.messageSource = messageSource;
}
@Autowired
public void setMetricRegistry(MetricRegistry metricRegistry) {
this.metricRegistry = metricRegistry;
}
private boolean processarDocumentPendentPortasignatures(
Integer id,
Portasignatures portasignatures) {
boolean resposta = false;
if (portasignatures != null) {
if (portasignatures.getDataProcessamentPrimer() == null)
portasignatures.setDataProcessamentPrimer(new Date());
portasignatures.setDataProcessamentDarrer(new Date());
Long tokenId = portasignatures.getTokenId();
JbpmToken token = jbpmDao.getTokenById(tokenId.toString());
DocumentStore documentStore = documentStoreDao.getById(portasignatures.getDocumentStoreId(), false);
if (documentStore != null) {
if (TipusEstat.SIGNAT.equals(portasignatures.getEstat()) ||
(TipusEstat.ERROR.equals(portasignatures.getEstat()) && Transicio.SIGNAT.equals(portasignatures.getTransition()))) {
// Processa els documents signats
try {
expedientLogHelper.afegirLogExpedientPerProces(
token.getProcessInstanceId(),
ExpedientLogAccioTipus.PROCES_DOCUMENT_SIGNAR,
new Boolean(true).toString());
if (documentStore.getReferenciaCustodia() == null) {
if (portasignatures.getDataCustodiaIntent() == null)
portasignatures.setDataCustodiaIntent(new Date());
afegirDocumentCustodia(
portasignatures.getDocumentId(),
documentStore);
portasignatures.setDataCustodiaOk(new Date());
}
if (portasignatures.getDataSignalIntent() == null)
portasignatures.setDataSignalIntent(new Date());
jbpmDao.signalToken(
tokenId.longValue(),
portasignatures.getTransicioOK());
portasignatures.setDataSignalOk(new Date());
portasignatures.setEstat(TipusEstat.PROCESSAT);
getServiceUtils().expedientIndexLuceneUpdate(
jbpmDao.getTokenById(tokenId.toString()).getProcessInstanceId());
resposta = true;
} catch (PluginException pex) {
errorProcesPsigna(
portasignatures,
getMissageFinalCadenaExcepcions(pex));
logger.error("Error al processar el document firmat pel callback (id=" + portasignatures.getDocumentId() + "): " + getMissageFinalCadenaExcepcions(pex), pex);
} catch (Exception ex) {
errorProcesPsigna(
portasignatures,
getMissageFinalCadenaExcepcions(ex));
logger.error("Error al processar el document firmat pel callback (id=" + portasignatures.getDocumentId() + ")", ex);
}
pluginPortasignaturesDao.saveOrUpdate(portasignatures);
} else if (TipusEstat.REBUTJAT.equals(portasignatures.getEstat()) ||
(TipusEstat.ERROR.equals(portasignatures.getEstat()) && Transicio.REBUTJAT.equals(portasignatures.getTransition()))) {
// Processa els documents rebujats
try {
expedientLogHelper.afegirLogExpedientPerProces(
token.getProcessInstanceId(),
ExpedientLogAccioTipus.PROCES_DOCUMENT_SIGNAR,
new Boolean(false).toString());
jbpmDao.signalToken(
tokenId.longValue(),
portasignatures.getTransicioKO());
portasignatures.setEstat(TipusEstat.PROCESSAT);
getServiceUtils().expedientIndexLuceneUpdate(
token.getProcessInstanceId());
resposta = true;
} catch (Exception ex) {
errorProcesPsigna(
portasignatures,
getMissageFinalCadenaExcepcions(ex));
logger.error("Error al processar el document rebutjat pel callback (id=" + portasignatures.getDocumentId() + ")", ex);
}
pluginPortasignaturesDao.saveOrUpdate(portasignatures);
} else {
String error = "El document de portasignatures (id=" + portasignatures.getDocumentId() + ") no està pendent de processar, està en estat " + portasignatures.getEstat().toString();
errorProcesPsigna(
portasignatures,
error);
logger.error(error);
}
} else {
String error = "El document rebut al callback (id=" + portasignatures.getDocumentId() + ") fa referència a un documentStore inexistent (id=" + portasignatures.getDocumentStoreId() + ")";
errorProcesPsigna(
portasignatures,
error);
logger.error(error);
}
List<Portasignatures> ambErrors = pluginPortasignaturesDao.findAmbErrorsPerExpedientId(portasignatures.getExpedient().getId());
if (ambErrors.size() > 0)
portasignatures.getExpedient().setErrorsIntegracions(true);
else
portasignatures.getExpedient().setErrorsIntegracions(false);
} else {
logger.error("El document de portasignatures (id=" + id + ") no s'ha trobat");
}
return resposta;
}
private void afegirDocumentCustodia(
Integer documentId,
DocumentStore documentStore) throws Exception {
Long documentStoreId = documentStore.getId();
DocumentDto document = documentHelper.getDocumentSenseContingut(documentStoreId);
if (document != null) {
JbpmProcessInstance rootProcessInstance = jbpmDao.getRootProcessInstance(documentStore.getProcessInstanceId());
Expedient expedient = expedientDao.findAmbProcessInstanceId(rootProcessInstance.getId());
String varDocumentCodi = documentStore.getJbpmVariable().substring(JbpmVars.PREFIX_DOCUMENT.length());
List<byte[]> signatures = obtenirSignaturesDelPortasignatures(documentId);
if (signatures != null) {
//logger.info(">>> [PSIGN] Té signatures i comença custòdia (psignaId=" + documentId + ", docStoreId=" + documentStoreId + ", refCustòdia=" + docst.getReferenciaCustodia() + ")");
if (documentStore.getReferenciaCustodia() != null) {
//logger.info(">>> [PSIGN] Abans esborrar signatures (psignaId=" + documentId + ", docStoreId=" + documentStoreId + ", refCustòdia=" + docst.getReferenciaCustodia() + ")");
pluginCustodiaDao.esborrarSignatures(documentStore.getReferenciaCustodia());
//logger.info(">>> [PSIGN] Després esborrar signatures (psignaId=" + documentId + ", docStoreId=" + documentStoreId + ", refCustòdia=" + docst.getReferenciaCustodia() + ")");
}
String referenciaCustodia = null;
for (byte[] signatura: signatures) {
try {
//logger.info(">>> [PSIGN] Abans cridada custòdia 1 (psignaId=" + documentId + ", docStoreId=" + documentStoreId + ")");
referenciaCustodia = pluginCustodiaDao.afegirSignatura(
documentStoreId,
documentStore.getReferenciaFont(),
document.getArxiuNom(),
document.getCustodiaCodi(),
signatura);
//logger.info(">>> [PSIGN] Després cridada custòdia 1 (psignaId=" + documentId + ", docStoreId=" + documentStoreId + ", refCustòdia=" + referenciaCustodia + ")");
} catch (Exception ex) {
// Si dona error perquè el document ja està arxivat l'esborra
// i el torna a crear.
//logger.info(">>> [PSIGN] Error custòdia (" + ex.getCause().getMessage() + ") (psignaId=" + documentId + ", docStoreId=" + documentStoreId + ", refCustòdia=" + referenciaCustodia + ")");
/*if (cercarMissatgeDinsCadenaExcepcions("ERROR_DOCUMENTO_ARCHIVADO", ex)) {
logger.info(">>> [PSIGN] Abans cridada esborrar signatures (psignaId=" + documentId + ", docStoreId=" + documentStoreId + ", refCustòdia=" + referenciaCustodia + ")");
pluginCustodiaDao.esborrarSignatures(documentStoreId.toString());
logger.info(">>> [PSIGN] Després cridada esborrar signatures (psignaId=" + documentId + ", docStoreId=" + documentStoreId + ", refCustòdia=" + referenciaCustodia + ")");
logger.info(">>> [PSIGN] Abans cridada custòdia 2 (psignaId=" + documentId + ", docStoreId=" + documentStoreId + ", refCustòdia=" + referenciaCustodia + ")");
referenciaCustodia = pluginCustodiaDao.afegirSignatura(
documentStoreId,
docst.getReferenciaFont(),
document.getArxiuNom(),
document.getCustodiaCodi(),
signatura);
logger.info(">>> [PSIGN] Després cridada custòdia 2 (psignaId=" + documentId + ", docStoreId=" + documentStoreId + ", refCustòdia=" + referenciaCustodia + ")");
} else {
throw ex;
}*/
logger.info(">>> [PSIGN] Processant error custòdia (" + getMissageFinalCadenaExcepcions(ex) + ", " + cercarMissatgeDinsCadenaExcepcions("ERROR_DOCUMENTO_ARCHIVADO", ex) + ") (psignaId=" + documentId + ", docStoreId=" + documentStoreId + ", refCustòdia=" + referenciaCustodia + ")");
if (cercarMissatgeDinsCadenaExcepcions("ERROR_DOCUMENTO_ARCHIVADO", ex)) {
referenciaCustodia = documentStoreId.toString();
} else {
throw ex;
}
}
}
//logger.info(">>> [PSIGN] Fi procés custòdia 1 (psignaId=" + documentId + ", docStoreId=" + documentStoreId + ", refCustòdia=" + referenciaCustodia + ")");
documentStore.setReferenciaCustodia(referenciaCustodia);
documentStore.setSignat(true);
registreDao.crearRegistreSignarDocument(
expedient.getId(),
documentStore.getProcessInstanceId(),
SecurityContextHolder.getContext().getAuthentication().getName(),
varDocumentCodi);
//logger.info(">>> [PSIGN] Fi procés custòdia 2 (psignaId=" + documentId + ", docStoreId=" + documentStoreId + ", refCustòdia=" + referenciaCustodia + ")");
} else {
//logger.info(">>> [PSIGN] No té signatures (psignaId=" + documentId + ", docStoreId=" + documentStoreId + ", refCustòdia=" + docst.getReferenciaCustodia() + ")");
throw new Exception(getServiceUtils().getMessage("error.pluginService.capSignatura"));
}
} else {
//logger.info(">>> [PSIGN] No s'ha trobat diocument (psignaId=" + documentId + ", docStoreId=" + documentStoreId + ")");
throw new IllegalStateException(getServiceUtils().getMessage("error.pluginService.noDisponible"));
}
//logger.info(">>> [PSIGN] Fi procés custòdia 3 (psignaId=" + documentId + ", docStoreId=" + documentStoreId + ")");
}
private List<byte[]> obtenirSignaturesDelPortasignatures(
Integer documentId) {
try {
return pluginPortasignaturesDao.obtenirSignaturesDocument(documentId);
} catch (Exception e) {
logger.error("Error obtenint el document del Portasignatures", e);
return null;
}
}
private boolean isSyncPersonesActiu() {
String syncActiu = GlobalProperties.getInstance().getProperty("app.persones.plugin.sync.actiu");
return "true".equalsIgnoreCase(syncActiu);
}
private boolean isIgnoreCase() {
String syncActiu = GlobalProperties.getInstance().getProperty("app.persones.plugin.ignore.case");
return "true".equalsIgnoreCase(syncActiu);
}
private ServiceUtils getServiceUtils() {
if (serviceUtils == null) {
serviceUtils = new ServiceUtils(
expedientDao,
definicioProcesDao,
campDao,
consultaCampDao,
luceneDao,
dtoConverter,
jbpmDao,
aclServiceDao,
messageSource,
metricRegistry);
}
return serviceUtils;
}
private boolean cercarMissatgeDinsCadenaExcepcions(String missatge, Throwable ex) {
//logger.info(">>> [PSIGN] Cercant missatge dins excepcio (missatge=" + missatge + ", getMessage=" + ex.getMessage() + ")");
if (ex.getMessage().contains(missatge))
return true;
if (ex.getCause() != null)
return cercarMissatgeDinsCadenaExcepcions(missatge, ex.getCause());
else
return false;
}
private String getMissageFinalCadenaExcepcions(Throwable ex) {
if (ex.getCause() == null) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
ex.printStackTrace(pw);
return sw.toString();
} else {
return getMissageFinalCadenaExcepcions(ex.getCause());
}
}
private void errorProcesPsigna(
Portasignatures portasignatures,
String errorCallback) {
portasignatures.setErrorCallbackProcessant(errorCallback);
portasignatures.setEstat(TipusEstat.ERROR);
String expedientResponsable = portasignatures.getExpedient().getResponsableCodi();
if (expedientResponsable != null) {
Alerta alerta = new Alerta(
new Date(),
expedientResponsable,
"",
portasignatures.getExpedient().getEntorn());
alerta.setExpedient(portasignatures.getExpedient());
DocumentDto document = documentHelper.getDocumentSenseContingut(portasignatures.getDocumentStoreId());
String causa = null;
if (document != null)
causa = "Error al processar resposta del portasignatures per al document \"" + document.getDocumentNom() + "\": " + errorCallback;
else
causa = "Error al processar resposta del portasignatures amb id " + portasignatures.getDocumentId();
if (causa.length() > 255)
alerta.setCausa(causa.substring(0, 248) + "[...]");
else
alerta.setCausa(causa);
alertaDao.saveOrUpdate(alerta);
}
}
/*private void enviarCorreuErrorPsigna(
String subject,
String text,
Throwable tr) {
String propRecipients = GlobalProperties.getInstance().getProperty("app.portasignatures.debug.email");
if (propRecipients != null && propRecipients.trim().length() > 0) {
List<String> recipients = new ArrayList<String>();
if (propRecipients.contains(",")) {
String[] recs = propRecipients.trim().split(",");
for (String rec: recs) {
if (rec.trim().length() > 0)
recipients.add(rec.trim());
}
} else {
recipients.add(propRecipients.trim());
}
StringBuilder sb = new StringBuilder();
sb.append(text);
if (tr != null) {
sb.append(text);
sb.append(getMissageFinalCadenaExcepcions(tr));
}
try {
mailDao.send(
GlobalProperties.getInstance().getProperty("app.correu.remitent"),
recipients,
null,
null,
subject,
sb.toString());
} catch (Exception ex) {
logger.error("No s'ha pogut enviar el correu d'error del portasignatures: " + subject, ex);
}
}
}*/
private static final Log logger = LogFactory.getLog(PluginService.class);
}