Tracciamento.java
/*
* GovWay - A customizable API Gateway
* https://govway.org
*
* Copyright (c) 2005-2024 Link.it srl (https://link.it).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3, as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openspcoop2.pdd.logger;
import java.io.ByteArrayOutputStream;
import java.sql.Connection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.mail.BodyPart;
import javax.xml.soap.AttachmentPart;
import javax.xml.soap.SOAPBody;
import org.openspcoop2.core.constants.TipoPdD;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.message.OpenSPCoop2Message;
import org.openspcoop2.message.constants.MessageRole;
import org.openspcoop2.message.constants.MessageType;
import org.openspcoop2.message.constants.ServiceBinding;
import org.openspcoop2.message.rest.MultipartContent;
import org.openspcoop2.message.soap.SoapUtils;
import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
import org.openspcoop2.pdd.core.CostantiPdD;
import org.openspcoop2.pdd.core.PdDContext;
import org.openspcoop2.pdd.core.connettori.ConnettoreUtils;
import org.openspcoop2.pdd.core.handlers.GeneratoreCasualeDate;
import org.openspcoop2.pdd.core.transazioni.RepositoryGestioneStateful;
import org.openspcoop2.pdd.core.transazioni.Transaction;
import org.openspcoop2.pdd.core.transazioni.TransactionContext;
import org.openspcoop2.pdd.core.transazioni.TransactionDeletedException;
import org.openspcoop2.pdd.core.transazioni.TransactionNotExistsException;
import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
import org.openspcoop2.protocol.engine.builder.TracciaBuilder;
import org.openspcoop2.protocol.sdk.Allegato;
import org.openspcoop2.protocol.sdk.Busta;
import org.openspcoop2.protocol.sdk.BustaRawContent;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.SecurityInfo;
import org.openspcoop2.protocol.sdk.constants.RuoloMessaggio;
import org.openspcoop2.protocol.sdk.constants.TipoSerializzazione;
import org.openspcoop2.protocol.sdk.state.IState;
import org.openspcoop2.protocol.sdk.state.RequestInfo;
import org.openspcoop2.protocol.sdk.state.StateMessage;
import org.openspcoop2.protocol.sdk.tracciamento.EsitoElaborazioneMessaggioTracciato;
import org.openspcoop2.protocol.sdk.tracciamento.ITracciaProducer;
import org.openspcoop2.protocol.sdk.tracciamento.Traccia;
import org.openspcoop2.protocol.sdk.tracciamento.TracciamentoException;
import org.openspcoop2.utils.MapKey;
import org.openspcoop2.utils.date.DateManager;
import org.openspcoop2.utils.mime.MimeMultipart;
import org.openspcoop2.utils.transport.http.HttpConstants;
import org.slf4j.Logger;
/**
* Contiene la definizione un Logger utilizzato dai nodi dell'infrastruttura di OpenSPCoop
* per il tracciamento di buste.
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class Tracciamento {
/** Indicazione di un tracciamento funzionante */
public static boolean tracciamentoDisponibile = true;
/** Primo errore avvenuto nel momento in cui è stato rilevato un malfunzionamento nel tracciamento */
public static Exception motivoMalfunzionamentoTracciamento = null;
/** Logger log4j utilizzato per scrivere i tracciamenti */
protected Logger loggerTracciamento = null;
/** Tipo Gateway */
private TipoPdD tipoPdD;
/** Soggetto che richiede il logger */
private IDSoggetto idSoggettoDominio;
/** PdDContext */
private PdDContext pddContext;
/** RequestInfo */
private RequestInfo requestInfo = null;
/** Protocol Factory */
private ProtocolFactoryManager protocolFactoryManager = null;
private IProtocolFactory<?> protocolFactory;
private boolean tracciamentoSupportatoProtocollo = true;
/** Appender personalizzati per i tracciamenti di OpenSPCoop */
private List<ITracciaProducer> loggerTracciamentoOpenSPCoopAppender = null;
private List<String> tipoTracciamentoOpenSPCoopAppender = null;
/** Reader della configurazione di OpenSPCoop */
private ConfigurazionePdDManager _configurazionePdDReader;
/** Stati */
private StateMessage state = null;
private StateMessage responseState = null;
/** XMLBuilder */
private TracciaBuilder xmlBuilder;
/** MsgDiagnostico per eventuali errori di tracciamento */
private MsgDiagnostico msgDiagErroreTracciamento = null;
/** OpenSPCoopProperties */
private OpenSPCoop2Properties openspcoopProperties = null;
/** Generatore di date casuali*/
private GeneratoreCasualeDate generatoreDateCasuali = null;
/** Transaction */
private Transaction transactionNullable = null;
public static String createLocationString(boolean bustaRicevuta,String location){
if(bustaRicevuta)
return ConnettoreUtils.limitLocation255Character(CostantiPdD.TRACCIAMENTO_IN+HttpConstants.SEPARATOR_SOURCE+location);
else
return ConnettoreUtils.limitLocation255Character(CostantiPdD.TRACCIAMENTO_OUT+HttpConstants.SEPARATOR_SOURCE+location);
}
public Tracciamento(IDSoggetto idSoggettoDominio,String idFunzione,PdDContext pddContext,TipoPdD tipoPdD,String nomePorta,
ConfigurazionePdDManager configurazionePdDManager) throws TracciamentoException {
this(idSoggettoDominio, idFunzione, pddContext, tipoPdD, nomePorta,
configurazionePdDManager, null, null);
}
/*
public Tracciamento(IDSoggetto idSoggettoDominio,String idFunzione,PdDContext pddContext,TipoPdD tipoPdD,String nomePorta,
IState statoRichiesta,IState statoRisposta) throws TracciamentoException {
this(idSoggettoDominio, idFunzione, pddContext, tipoPdD, nomePorta,
null, statoRichiesta, statoRisposta);
}
*/
private Tracciamento(IDSoggetto idSoggettoDominio,String idFunzione,PdDContext pddContext,TipoPdD tipoPdD,String nomePorta,
ConfigurazionePdDManager configurazionePdDManagerParam, IState stateParam,IState responseStateParam) throws TracciamentoException {
this.idSoggettoDominio = idSoggettoDominio;
this.pddContext=pddContext;
this.tipoPdD = tipoPdD;
this.loggerTracciamento = OpenSPCoop2Logger.loggerTracciamento;
this.loggerTracciamentoOpenSPCoopAppender = OpenSPCoop2Logger.loggerTracciamentoOpenSPCoopAppender;
this.tipoTracciamentoOpenSPCoopAppender = OpenSPCoop2Logger.tipoTracciamentoOpenSPCoopAppender;
if(configurazionePdDManagerParam!=null) {
this._configurazionePdDReader = configurazionePdDManagerParam;
this.state = this._configurazionePdDReader.getState();
this.responseState = this._configurazionePdDReader.getResponseState();
}
else {
if(stateParam!=null && stateParam instanceof StateMessage){
this.state = (StateMessage) stateParam;
}
if(responseStateParam!=null && responseStateParam instanceof StateMessage){
this.responseState = (StateMessage) responseStateParam;
}
this._configurazionePdDReader = ConfigurazionePdDManager.getInstance(this.state, this.responseState);
}
if(pddContext!=null && pddContext.containsKey(org.openspcoop2.core.constants.Costanti.REQUEST_INFO)) {
this.requestInfo = (RequestInfo) pddContext.getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
}
this.msgDiagErroreTracciamento = MsgDiagnostico.newInstance(tipoPdD,idSoggettoDominio,idFunzione,nomePorta, this.requestInfo ,this._configurazionePdDReader);
this.msgDiagErroreTracciamento.setPrefixMsgPersonalizzati(MsgDiagnosticiProperties.MSG_DIAG_TRACCIAMENTO);
try{
if(this.pddContext==null) {
throw new Exception("PdDContext is null");
}
this.protocolFactoryManager = ProtocolFactoryManager.getInstance();
this.protocolFactory = this.protocolFactoryManager.getProtocolFactoryByName((String) this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME));
this.tracciamentoSupportatoProtocollo = this.protocolFactory.createProtocolConfiguration().isAbilitataGenerazioneTracce();
} catch(Throwable e){
throw new TracciamentoException(e.getMessage(),e);
}
this.xmlBuilder = new TracciaBuilder(this.protocolFactory);
this.openspcoopProperties = OpenSPCoop2Properties.getInstance();
if(this.openspcoopProperties.generazioneDateCasualiLogAbilitato()){
this.generatoreDateCasuali = GeneratoreCasualeDate.getGeneratoreCasualeDate();
}
try{
if(this.pddContext!=null && this.pddContext.containsKey(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)) {
String idTransazione = (String) this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE);
this.transactionNullable = TransactionContext.getTransaction(idTransazione);
}
}catch(Exception e){
// La transazione potrebbe essere stata eliminata nelle comunicazioni stateful
}
}
private ConfigurazionePdDManager getConfigurazionePdDManager() {
if(this._configurazionePdDReader!=null) {
return this._configurazionePdDReader;
}
if(this.state!=null || this.responseState!=null) {
return ConfigurazionePdDManager.getInstance(this.state, this.responseState);
}
return ConfigurazionePdDManager.getInstance();
}
public void updateState(IState requestStateParam, IState responseStateParam) {
StateMessage requestState = null;
StateMessage responseState = null;
if(requestStateParam!=null && requestStateParam instanceof StateMessage) {
requestState = (StateMessage) requestStateParam;
}
if(responseStateParam!=null && responseStateParam instanceof StateMessage) {
responseState = (StateMessage) responseStateParam;
}
updateState(requestState, responseState);
}
public void updateState(StateMessage requestState, StateMessage responseState){
this.state = requestState;
this.responseState = responseState;
if(this.state!=null || this.responseState!=null) {
if(this._configurazionePdDReader!=null) {
this._configurazionePdDReader = this._configurazionePdDReader.refreshState(this.state, this.responseState);
}
else {
this._configurazionePdDReader = ConfigurazionePdDManager.getInstance(this.state, this.responseState);
}
}
else {
this._configurazionePdDReader = ConfigurazionePdDManager.getInstance();
}
}
public void updateState(ConfigurazionePdDManager configurazionePdDManager){
this._configurazionePdDReader = configurazionePdDManager;
if(this._configurazionePdDReader!=null) {
this.state = this._configurazionePdDReader.getState();
this.responseState = this._configurazionePdDReader.getResponseState();
}
}
/**
* Il Metodo si occupa di impostare il dominio del Soggetto che utilizza il logger.
*
* @param dominio Soggetto che richiede il logger
*
*/
public void setDominio(IDSoggetto dominio){
this.idSoggettoDominio = dominio;
}
private Connection getConnectionFromState(boolean richiesta){
if(richiesta){
Connection c = StateMessage.getConnection(this.state);
if(c!=null) {
return c;
}
}
else{
Connection c = StateMessage.getConnection(this.responseState);
if(c!=null) {
return c;
}
}
return null;
}
/** ----------------- METODI DI LOGGING (Tracciamento buste) ---------------- */
/**
* Il Metodo si occupa di tracciare una busta di richiesta.
*
* @param busta Busta da registrare
*
*/
@Deprecated
public void registraRichiesta(OpenSPCoop2Message msg,SecurityInfo securityInfo,
Busta busta,EsitoElaborazioneMessaggioTracciato esito,String location) throws TracciamentoException {
registraRichiesta(msg,securityInfo,busta,esito,location,null);
}
@Deprecated
public void registraRichiesta(OpenSPCoop2Message msg,SecurityInfo securityInfo,
Busta busta,EsitoElaborazioneMessaggioTracciato esito,String location,
String idCorrelazioneApplicativa) throws TracciamentoException {
if(this.transactionNullable!=null) {
this.transactionNullable.getTempiElaborazione().startTracciamentoRichiesta();
}
try {
if(this.tracciamentoSupportatoProtocollo && this.getConfigurazionePdDManager().tracciamentoBuste()){
String xml = null;
boolean erroreAppender = false;
// Data
Date gdo = DateManager.getDate();
if(this.openspcoopProperties.generazioneDateCasualiLogAbilitato() && this.pddContext!=null && this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)!=null){
gdo = this.generatoreDateCasuali.getProssimaData((String)this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE));
busta.setOraRegistrazione(gdo);
}
// Traccia
Traccia traccia = this.getTraccia(busta, msg,securityInfo, esito, gdo, RuoloMessaggio.RICHIESTA, location, idCorrelazioneApplicativa);
try{
// Miglioramento performance
if(OpenSPCoop2Logger.loggerTracciamentoAbilitato){
xml = this.xmlBuilder.toString(traccia,TipoSerializzazione.DEFAULT);
if(xml==null)
throw new Exception("Traccia non costruita");
this.loggerTracciamento.info(xml);
}
// TransazioneContext
if(this.openspcoopProperties.isTransazioniSaveTracceInUniqueTransaction()) {
this.logTracciaInTransactionContext(traccia, true);
}
// Tracciamento personalizzato
for(int i=0; i<this.loggerTracciamentoOpenSPCoopAppender.size();i++){
try{
this.loggerTracciamentoOpenSPCoopAppender.get(i).log(getConnectionFromState(true), traccia);
}catch(Exception e){
logError("Errore durante il tracciamento personalizzato ["+this.tipoTracciamentoOpenSPCoopAppender.get(i)+"] della richiesta: "+e.getMessage()+". Traccia non registrata:\n"+xml,e);
try{
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, RuoloMessaggio.RICHIESTA.toString());
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA, xml);
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_PERSONALIZZATO,this.tipoTracciamentoOpenSPCoopAppender.get(i));
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
this.msgDiagErroreTracciamento.logPersonalizzato("registrazioneNonRiuscita.openspcoopAppender");
}catch(Exception eMsg){
// ignore
}
if(this.openspcoopProperties.isTracciaturaFallita_BloccaCooperazioneInCorso()){
erroreAppender = true;
throw e; // Rilancio
}
}
}
}catch(Exception e){
// check eventuale costruzione dell'xml non fatto per log4j disabilitato.
if( (xml==null) && (OpenSPCoop2Logger.loggerTracciamentoAbilitato==false) ){
try{
xml = this.xmlBuilder.toString(traccia,TipoSerializzazione.DEFAULT);
}catch(Exception eBuild){}
}
if(xml==null){
logError("Errore durante la costruzione della traccia: "+e.getMessage(),e);
}else{
logError("Errore durante il tracciamento della richiesta: "+e.getMessage()+". Traccia non registrata:\n"+xml,e);
if(!erroreAppender){
try{
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, RuoloMessaggio.RICHIESTA.toString());
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA, xml);
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
this.msgDiagErroreTracciamento.logPersonalizzato("registrazioneNonRiuscita");
}catch(Exception eMsg){}
}
}
gestioneErroreTracciamento(e);
}
}
}finally {
if(this.transactionNullable!=null) {
this.transactionNullable.getTempiElaborazione().endTracciamentoRichiesta();
}
}
}
/**
* Il Metodo si occupa di tracciare una busta di richiesta.
*
* @param busta Busta da registrare in byte
* @param bustaObject Busta da registrare (per appender personalizzati)
*
*/
@Deprecated
public void registraRichiesta(OpenSPCoop2Message msg,SecurityInfo securityInfo,
byte[] busta,Busta bustaObject,EsitoElaborazioneMessaggioTracciato esito,String location) throws TracciamentoException {
registraRichiesta(msg,securityInfo,busta,bustaObject,esito,location,null);
}
@Deprecated
public void registraRichiesta(OpenSPCoop2Message msg,SecurityInfo securityInfo,
byte[] busta,Busta bustaObject,EsitoElaborazioneMessaggioTracciato esito,String location,
String idCorrelazioneApplicativa) throws TracciamentoException {
if(this.transactionNullable!=null) {
this.transactionNullable.getTempiElaborazione().startTracciamentoRichiesta();
}
try {
if(this.tracciamentoSupportatoProtocollo && this.getConfigurazionePdDManager().tracciamentoBuste()){
String xml = null;
boolean erroreAppender = false;
// Data
Date gdo = DateManager.getDate();
if(this.openspcoopProperties.generazioneDateCasualiLogAbilitato() && this.pddContext!=null && this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)!=null){
gdo = this.generatoreDateCasuali.getProssimaData((String)this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE));
bustaObject.setOraRegistrazione(gdo);
}
// Traccia
Traccia traccia = this.getTraccia(bustaObject, msg, securityInfo, esito, gdo, RuoloMessaggio.RICHIESTA, location, idCorrelazioneApplicativa);
traccia.setBustaAsByteArray(busta);
try{
// Miglioramento performance
if(OpenSPCoop2Logger.loggerTracciamentoAbilitato){
xml = this.xmlBuilder.toString(traccia,TipoSerializzazione.DEFAULT);
if(xml==null)
throw new Exception("Traccia non costruita");
this.loggerTracciamento.info(xml);
}
// TransazioneContext
if(this.openspcoopProperties.isTransazioniSaveTracceInUniqueTransaction()) {
this.logTracciaInTransactionContext(traccia, true);
}
// Tracciamento personalizzato
for(int i=0; i<this.loggerTracciamentoOpenSPCoopAppender.size();i++){
try{
this.loggerTracciamentoOpenSPCoopAppender.get(i).log(getConnectionFromState(true), traccia);
}catch(Exception e){
logError("Errore durante il tracciamento personalizzato ["+this.tipoTracciamentoOpenSPCoopAppender.get(i)+"] della richiesta: "+e.getMessage()+". Traccia non registrata:\n"+xml,e);
try{
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, RuoloMessaggio.RICHIESTA.toString());
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA, xml);
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_PERSONALIZZATO,this.tipoTracciamentoOpenSPCoopAppender.get(i));
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
this.msgDiagErroreTracciamento.logPersonalizzato("registrazioneNonRiuscita.openspcoopAppender");
}catch(Exception eMsg){
// ignore
}
if(this.openspcoopProperties.isTracciaturaFallita_BloccaCooperazioneInCorso()){
erroreAppender = true;
throw e; // Rilancio
}
}
}
}catch(Exception e){
// check eventuale costruzione dell'xml non fatto per log4j disabilitato.
if( (xml==null) && (OpenSPCoop2Logger.loggerTracciamentoAbilitato==false) ){
try{
xml = this.xmlBuilder.toString(traccia,TipoSerializzazione.DEFAULT);
}catch(Exception eBuild){}
}
if(xml==null){
logError("Errore durante la costruzione della traccia: "+e.getMessage(),e);
}else{
logError("Errore durante il tracciamento della richiesta: "+e.getMessage()+". Traccia non registrata:\n"+xml,e);
if(!erroreAppender){
try{
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, RuoloMessaggio.RICHIESTA.toString());
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA, xml);
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
this.msgDiagErroreTracciamento.logPersonalizzato("registrazioneNonRiuscita");
}catch(Exception eMsg){}
}
}
gestioneErroreTracciamento(e);
}
}
}finally {
if(this.transactionNullable!=null) {
this.transactionNullable.getTempiElaborazione().endTracciamentoRichiesta();
}
}
}
/**
* Il Metodo si occupa di tracciare una busta di richiesta.
*
* @param busta Busta da registrare
* @param bustaObject Busta da registrare (per appender personalizzati)
*
*/
public void registraRichiesta(OpenSPCoop2Message msg,SecurityInfo securityInfo,
BustaRawContent<?> busta,Busta bustaObject,EsitoElaborazioneMessaggioTracciato esito, String location) throws TracciamentoException {
registraRichiesta(msg,securityInfo,busta,bustaObject,esito,location,null);
}
public void registraRichiesta(OpenSPCoop2Message msg,SecurityInfo securityInfo,
BustaRawContent<?> busta,Busta bustaObject,EsitoElaborazioneMessaggioTracciato esito, String location,
String idCorrelazioneApplicativa) throws TracciamentoException {
if(this.transactionNullable!=null) {
this.transactionNullable.getTempiElaborazione().startTracciamentoRichiesta();
}
try {
if(this.tracciamentoSupportatoProtocollo && this.getConfigurazionePdDManager().tracciamentoBuste()) {
String xml = null;
boolean erroreAppender = false;
// Data
Date gdo = DateManager.getDate();
if(this.openspcoopProperties.generazioneDateCasualiLogAbilitato() && this.pddContext!=null && this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)!=null){
gdo = this.generatoreDateCasuali.getProssimaData((String)this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE));
bustaObject.setOraRegistrazione(gdo);
}
// Traccia
Traccia traccia = this.getTraccia(bustaObject, msg, securityInfo, esito, gdo, RuoloMessaggio.RICHIESTA, location, idCorrelazioneApplicativa);
boolean saveHeader = true;
try {
saveHeader = (this.protocolFactory==null || this.protocolFactory.createProtocolConfiguration().isAbilitatoSalvataggioHeaderProtocolloTracce());
}catch(Throwable e) {
this.logError("Comprensione opzione 'salvataggio header protocollo tracce' fallita: "+e.getMessage(), new Exception(e));
}
if(saveHeader) {
traccia.setBustaAsRawContent(busta);
}
try{
// Miglioramento performance
if(OpenSPCoop2Logger.loggerTracciamentoAbilitato){
xml = this.xmlBuilder.toString(traccia,TipoSerializzazione.DEFAULT);
if(xml==null)
throw new Exception("Traccia non costruita");
this.loggerTracciamento.info(xml);
}
// TransazioneContext
if(this.openspcoopProperties.isTransazioniSaveTracceInUniqueTransaction()) {
this.logTracciaInTransactionContext(traccia, true);
}
// Tracciamento personalizzato
for(int i=0; i<this.loggerTracciamentoOpenSPCoopAppender.size();i++){
try{
this.loggerTracciamentoOpenSPCoopAppender.get(i).log(getConnectionFromState(true), traccia);
} catch(Exception e){
logError("Errore durante il tracciamento personalizzato ["+this.tipoTracciamentoOpenSPCoopAppender.get(i)+"] della richiesta: "+e.getMessage()+". Traccia non registrata:\n"+xml,e);
try{
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, RuoloMessaggio.RICHIESTA.toString());
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA, xml);
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_PERSONALIZZATO,this.tipoTracciamentoOpenSPCoopAppender.get(i));
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
this.msgDiagErroreTracciamento.logPersonalizzato("registrazioneNonRiuscita.openspcoopAppender");
}catch(Exception eMsg){
// ignore
}
if(this.openspcoopProperties.isTracciaturaFallita_BloccaCooperazioneInCorso()){
erroreAppender = true;
throw e; // Rilancio
}
}
}
}catch(Exception e){
// check eventuale costruzione dell'xml non fatto per log4j disabilitato.
if( (xml==null) && (OpenSPCoop2Logger.loggerTracciamentoAbilitato==false) ){
try{
xml = this.xmlBuilder.toString(traccia,TipoSerializzazione.DEFAULT);
}catch(Exception eBuild){}
}
if(xml==null){
logError("Errore durante la costruzione della traccia: "+e.getMessage(),e);
}else{
logError("Errore durante il tracciamento della richiesta: "+e.getMessage()+". Traccia non registrata:\n"+xml,e);
if(!erroreAppender){
try{
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, RuoloMessaggio.RICHIESTA.toString());
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA, xml);
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
this.msgDiagErroreTracciamento.logPersonalizzato("registrazioneNonRiuscita");
}catch(Exception eMsg){}
}
}
gestioneErroreTracciamento(e);
}
}
}finally {
if(this.transactionNullable!=null) {
this.transactionNullable.getTempiElaborazione().endTracciamentoRichiesta();
}
}
}
/**
* Il Metodo si occupa di tracciare una busta di risposta.
*
* @param busta Busta da registrare
*
*/
@Deprecated
public void registraRisposta(OpenSPCoop2Message msg,SecurityInfo securityInfo,
Busta busta,EsitoElaborazioneMessaggioTracciato esito, String location) throws TracciamentoException {
registraRisposta(msg,securityInfo,busta,esito,location,null,null);
}
@Deprecated
public void registraRisposta(OpenSPCoop2Message msg,SecurityInfo securityInfo,
Busta busta,EsitoElaborazioneMessaggioTracciato esito, String location,
String idCorrelazioneApplicativa, String idCorrelazioneApplicativaRisposta) throws TracciamentoException {
if(this.transactionNullable!=null) {
this.transactionNullable.getTempiElaborazione().startTracciamentoRisposta();
}
try {
if(this.tracciamentoSupportatoProtocollo && this.getConfigurazionePdDManager().tracciamentoBuste()){
String xml = null;
boolean erroreAppender = false;
// Data
Date gdo = DateManager.getDate();
if(this.openspcoopProperties.generazioneDateCasualiLogAbilitato() && this.pddContext!=null && this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)!=null){
gdo = this.generatoreDateCasuali.getProssimaData((String)this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE));
busta.setOraRegistrazione(gdo);
}
// Traccia
Traccia traccia = this.getTraccia(busta, msg, securityInfo, esito, gdo, RuoloMessaggio.RISPOSTA, location, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta);
try{
// Miglioramento performance
if(OpenSPCoop2Logger.loggerTracciamentoAbilitato){
xml = this.xmlBuilder.toString(traccia,TipoSerializzazione.DEFAULT);
if(xml==null)
throw new Exception("Traccia non costruita");
this.loggerTracciamento.info(xml);
}
// TransazioneContext
if(this.openspcoopProperties.isTransazioniSaveTracceInUniqueTransaction()) {
this.logTracciaInTransactionContext(traccia, false);
}
// Tracciamento personalizzato
for(int i=0; i<this.loggerTracciamentoOpenSPCoopAppender.size();i++){
try{
this.loggerTracciamentoOpenSPCoopAppender.get(i).log(getConnectionFromState(false), traccia);
}catch(Exception e){
logError("Errore durante il tracciamento personalizzato ["+this.tipoTracciamentoOpenSPCoopAppender.get(i)+"] della risposta: "+e.getMessage()+". Traccia non registrata:\n"+xml,e);
try{
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, RuoloMessaggio.RISPOSTA.toString());
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA, xml);
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_PERSONALIZZATO,this.tipoTracciamentoOpenSPCoopAppender.get(i));
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
this.msgDiagErroreTracciamento.logPersonalizzato("registrazioneNonRiuscita.openspcoopAppender");
}catch(Exception eMsg){
// ignore
}
if(this.openspcoopProperties.isTracciaturaFallita_BloccaCooperazioneInCorso()){
erroreAppender = true;
throw e; // Rilancio
}
}
}
}catch(Exception e){
// check eventuale costruzione dell'xml non fatto per log4j disabilitato.
if( (xml==null) && (OpenSPCoop2Logger.loggerTracciamentoAbilitato==false) ){
try{
xml = this.xmlBuilder.toString(traccia,TipoSerializzazione.DEFAULT);
}catch(Exception eBuild){}
}
if(xml==null){
logError("Errore durante la costruzione della traccia: "+e.getMessage(),e);
}else{
logError("Errore durante il tracciamento della risposta: "+e.getMessage()+". Traccia non registrata:\n"+xml,e);
if(!erroreAppender){
try{
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, RuoloMessaggio.RISPOSTA.toString());
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA, xml);
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
this.msgDiagErroreTracciamento.logPersonalizzato("registrazioneNonRiuscita");
}catch(Exception eMsg){}
}
}
gestioneErroreTracciamento(e);
}
}
}finally {
if(this.transactionNullable!=null) {
this.transactionNullable.getTempiElaborazione().endTracciamentoRisposta();
}
}
}
/**
* Il Metodo si occupa di tracciare una busta di risposta.
*
* @param busta Busta da registrare
* @param bustaObject Busta da registrare (per appender personalizzati)
*
*/
@Deprecated
public void registraRisposta(OpenSPCoop2Message msg,SecurityInfo securityInfo,
byte[] busta,Busta bustaObject,EsitoElaborazioneMessaggioTracciato esito, String location) throws TracciamentoException {
registraRisposta(msg,securityInfo,busta,bustaObject,esito, location,null,null);
}
@Deprecated
public void registraRisposta(OpenSPCoop2Message msg,SecurityInfo securityInfo,
byte[] busta,Busta bustaObject,EsitoElaborazioneMessaggioTracciato esito, String location,
String idCorrelazioneApplicativa, String idCorrelazioneApplicativaRisposta) throws TracciamentoException{
if(this.transactionNullable!=null) {
this.transactionNullable.getTempiElaborazione().startTracciamentoRisposta();
}
try {
if(this.tracciamentoSupportatoProtocollo && this.getConfigurazionePdDManager().tracciamentoBuste()){
String xml = null;
boolean erroreAppender = false;
// Data
Date gdo = DateManager.getDate();
if(this.openspcoopProperties.generazioneDateCasualiLogAbilitato() && this.pddContext!=null && this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)!=null){
gdo = this.generatoreDateCasuali.getProssimaData((String)this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE));
bustaObject.setOraRegistrazione(gdo);
}
// Traccia
Traccia traccia = this.getTraccia(bustaObject, msg, securityInfo, esito, gdo, RuoloMessaggio.RISPOSTA, location, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta);
traccia.setBustaAsByteArray(busta);
try{
// Miglioramento performance
if(OpenSPCoop2Logger.loggerTracciamentoAbilitato){
xml = this.xmlBuilder.toString(traccia,TipoSerializzazione.DEFAULT);
if(xml==null)
throw new Exception("Traccia non costruita");
this.loggerTracciamento.info(xml);
}
// TransazioneContext
if(this.openspcoopProperties.isTransazioniSaveTracceInUniqueTransaction()) {
this.logTracciaInTransactionContext(traccia, false);
}
// Tracciamento personalizzato
for(int i=0; i<this.loggerTracciamentoOpenSPCoopAppender.size();i++){
try{
this.loggerTracciamentoOpenSPCoopAppender.get(i).log(getConnectionFromState(false), traccia);
}catch(Exception e){
logError("Errore durante il tracciamento personalizzato ["+this.tipoTracciamentoOpenSPCoopAppender.get(i)+"] della risposta: "+e.getMessage()+". Traccia non registrata:\n"+xml,e);
try{
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, RuoloMessaggio.RISPOSTA.toString());
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA, xml);
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_PERSONALIZZATO,this.tipoTracciamentoOpenSPCoopAppender.get(i));
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
this.msgDiagErroreTracciamento.logPersonalizzato("registrazioneNonRiuscita.openspcoopAppender");
}catch(Exception eMsg){
// ignore
}
if(this.openspcoopProperties.isTracciaturaFallita_BloccaCooperazioneInCorso()){
erroreAppender = true;
throw e; // Rilancio
}
}
}
}catch(Exception e){
// check eventuale costruzione dell'xml non fatto per log4j disabilitato.
if( (xml==null) && (OpenSPCoop2Logger.loggerTracciamentoAbilitato==false) ){
try{
xml = this.xmlBuilder.toString(traccia,TipoSerializzazione.DEFAULT);
}catch(Exception eBuild){}
}
if(xml==null){
logError("Errore durante la costruzione della traccia: "+e.getMessage(),e);
}else{
logError("Errore durante il tracciamento della risposta: "+e.getMessage()+". Traccia non registrata:\n"+xml,e);
if(!erroreAppender){
try{
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, RuoloMessaggio.RISPOSTA.toString());
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA, xml);
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
this.msgDiagErroreTracciamento.logPersonalizzato("registrazioneNonRiuscita");
}catch(Exception eMsg){}
}
}
gestioneErroreTracciamento(e);
}
}
}finally {
if(this.transactionNullable!=null) {
this.transactionNullable.getTempiElaborazione().endTracciamentoRisposta();
}
}
}
/**
* Il Metodo si occupa di tracciare una busta di risposta.
*
* @param busta Busta da registrare
* @param bustaObject Busta da registrare (per appender personalizzati)
*
*/
public void registraRisposta(OpenSPCoop2Message msg,SecurityInfo securityInfo,
BustaRawContent<?> busta,Busta bustaObject,EsitoElaborazioneMessaggioTracciato esito, String location) throws TracciamentoException {
registraRisposta(msg,securityInfo,busta,bustaObject,esito, location,null,null);
}
public void registraRisposta(OpenSPCoop2Message msg,SecurityInfo securityInfo,
BustaRawContent<?> busta,Busta bustaObject,EsitoElaborazioneMessaggioTracciato esito, String location,
String idCorrelazioneApplicativa, String idCorrelazioneApplicativaRisposta) throws TracciamentoException {
if(this.transactionNullable!=null) {
this.transactionNullable.getTempiElaborazione().startTracciamentoRisposta();
}
try {
if(this.tracciamentoSupportatoProtocollo && this.getConfigurazionePdDManager().tracciamentoBuste()){
String xml = null;
boolean erroreAppender = false;
// Data
Date gdo = DateManager.getDate();
if(this.openspcoopProperties.generazioneDateCasualiLogAbilitato() && this.pddContext!=null && this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)!=null){
gdo = this.generatoreDateCasuali.getProssimaData((String)this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE));
bustaObject.setOraRegistrazione(gdo);
}
// Traccia
Traccia traccia = this.getTraccia(bustaObject, msg, securityInfo, esito, gdo, RuoloMessaggio.RISPOSTA, location, idCorrelazioneApplicativa, idCorrelazioneApplicativaRisposta);
boolean saveHeader = true;
try {
saveHeader = (this.protocolFactory==null || this.protocolFactory.createProtocolConfiguration().isAbilitatoSalvataggioHeaderProtocolloTracce());
}catch(Throwable e) {
this.logError("Comprensione opzione 'salvataggio header protocollo tracce' fallita: "+e.getMessage(), new Exception(e));
}
if(saveHeader) {
traccia.setBustaAsRawContent(busta);
}
try{
// Miglioramento performance
if(OpenSPCoop2Logger.loggerTracciamentoAbilitato){
xml = this.xmlBuilder.toString(traccia,TipoSerializzazione.DEFAULT);
if(xml==null)
throw new Exception("Traccia non costruita");
this.loggerTracciamento.info(xml);
}
// TransazioneContext
if(this.openspcoopProperties.isTransazioniSaveTracceInUniqueTransaction()) {
this.logTracciaInTransactionContext(traccia, false);
}
// Tracciamento personalizzato
for(int i=0; i<this.loggerTracciamentoOpenSPCoopAppender.size();i++){
try{
this.loggerTracciamentoOpenSPCoopAppender.get(i).log(getConnectionFromState(false), traccia);
}catch(Exception e){
logError("Errore durante il tracciamento personalizzato ["+this.tipoTracciamentoOpenSPCoopAppender.get(i)+"] della risposta: "+e.getMessage()+". Traccia non registrata:\n"+xml,e);
try{
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, RuoloMessaggio.RISPOSTA.toString());
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA, xml);
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_PERSONALIZZATO,this.tipoTracciamentoOpenSPCoopAppender.get(i));
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
this.msgDiagErroreTracciamento.logPersonalizzato("registrazioneNonRiuscita.openspcoopAppender");
}catch(Exception eMsg){
// ignore
}
if(this.openspcoopProperties.isTracciaturaFallita_BloccaCooperazioneInCorso()){
erroreAppender = true;
throw e; // Rilancio
}
}
}
}catch(Exception e){
// check eventuale costruzione dell'xml non fatto per log4j disabilitato.
if( (xml==null) && (OpenSPCoop2Logger.loggerTracciamentoAbilitato==false) ){
try{
xml = this.xmlBuilder.toString(traccia,TipoSerializzazione.DEFAULT);
}catch(Exception eBuild){}
}
if(xml==null){
logError("Errore durante la costruzione della traccia: "+e.getMessage(),e);
}else{
logError("Errore durante il tracciamento della risposta: "+e.getMessage()+". Traccia non registrata:\n"+xml,e);
if(!erroreAppender){
try{
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, RuoloMessaggio.RISPOSTA.toString());
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIA, xml);
this.msgDiagErroreTracciamento.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
this.msgDiagErroreTracciamento.logPersonalizzato("registrazioneNonRiuscita");
}catch(Exception eMsg){}
}
}
gestioneErroreTracciamento(e);
}
}
}finally {
if(this.transactionNullable!=null) {
this.transactionNullable.getTempiElaborazione().endTracciamentoRisposta();
}
}
}
private void logTracciaInTransactionContext(Traccia traccia, boolean richiesta) throws TracciamentoException {
Exception exc = null;
boolean gestioneStateful = false;
try {
Transaction tr = TransactionContext.getTransaction(traccia.getIdTransazione());
if(richiesta) {
tr.setTracciaRichiesta(traccia);
}
else {
tr.setTracciaRisposta(traccia);
}
}catch(TransactionDeletedException e){
gestioneStateful = true;
}catch(TransactionNotExistsException e){
gestioneStateful = true;
}catch(Exception e){
exc = e;
}
if(gestioneStateful){
try{
//System.out.println("@@@@@REPOSITORY@@@@@ LOG MSG DIAG ID TRANSAZIONE ["+idTransazione+"] ADD");
RepositoryGestioneStateful.addTraccia(traccia.getIdTransazione(), traccia);
}catch(Exception e){
exc = e;
}
}
if(exc!=null) {
logError("Errore durante l'emissione della traccia nel contesto della transazione: "+exc.getMessage(),exc);
gestioneErroreTracciamento(exc);
}
}
private Traccia getTraccia(Busta busta,OpenSPCoop2Message msg,SecurityInfo securityInfo,EsitoElaborazioneMessaggioTracciato esito,Date gdo,RuoloMessaggio tipoTraccia,
String location,String idCorrelazioneApplicativa){
return getTraccia(busta, msg, securityInfo, esito, gdo, tipoTraccia, location, idCorrelazioneApplicativa, null);
}
private Traccia getTraccia(Busta busta,OpenSPCoop2Message msg,SecurityInfo securityInfo,EsitoElaborazioneMessaggioTracciato esito,Date gdo,RuoloMessaggio tipoTraccia,
String location,String idCorrelazioneApplicativa,String idCorrelazioneApplicativaRisposta){
Traccia traccia = new Traccia();
if(this.pddContext!=null) {
traccia.setIdTransazione((String) this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE));
}
// Esito
traccia.setEsitoElaborazioneMessaggioTracciato(esito);
try{
if(RuoloMessaggio.RISPOSTA.equals(tipoTraccia) && msg!=null){
boolean found = false;
if(ServiceBinding.SOAP.equals(msg.getServiceBinding())){
if(msg.castAsSoap().hasSOAPFault()){
SOAPBody body = msg.castAsSoap().getSOAPBody();
found = true;
StringBuilder bf = new StringBuilder();
if(esito.getDettaglio()!=null){
bf.append(esito.getDettaglio());
bf.append("\n");
}
bf.append(SoapUtils.safe_toString(msg.getFactory(), body.getFault(), OpenSPCoop2Logger.loggerOpenSPCoopCore));
traccia.getEsitoElaborazioneMessaggioTracciato().setDettaglio(bf.toString());
}
}
else {
if(msg.castAsRest().isProblemDetailsForHttpApis_RFC7807()) {
found = true;
ByteArrayOutputStream bout = new ByteArrayOutputStream();
msg.writeTo(bout, false);
bout.flush();
bout.close();
StringBuilder bf = new StringBuilder();
if(esito.getDettaglio()!=null){
bf.append(esito.getDettaglio());
bf.append("\n");
}
bf.append(bout.toString());
traccia.getEsitoElaborazioneMessaggioTracciato().setDettaglio(bf.toString());
}
}
if(!found && MessageRole.FAULT.equals(msg.getMessageRole())){
ByteArrayOutputStream bout = new ByteArrayOutputStream();
msg.writeTo(bout, false);
bout.flush();
bout.close();
StringBuilder bf = new StringBuilder();
if(esito.getDettaglio()!=null){
bf.append(esito.getDettaglio());
bf.append("\n");
}
bf.append(bout.toString());
traccia.getEsitoElaborazioneMessaggioTracciato().setDettaglio(bf.toString());
}
}
}catch(Exception e){
this.logError("errore durante la registrazione del SOAPFault nelle tracce", e);
}
traccia.setGdo(gdo);
traccia.setIdSoggetto(this.idSoggettoDominio);
traccia.setTipoMessaggio(tipoTraccia);
traccia.setTipoPdD(this.tipoPdD);
traccia.setCorrelazioneApplicativa(idCorrelazioneApplicativa);
traccia.setCorrelazioneApplicativaRisposta(idCorrelazioneApplicativaRisposta);
if(location!=null) {
if(location.length()>230) { // sto piu' basso di 255 per evitare caratteri strani che occupano più bytes.
traccia.setLocation(location.substring(0, 230)+" ...");
}
else {
traccia.setLocation(location);
}
}
traccia.setProtocollo(this.protocolFactory.getProtocol());
if(securityInfo!=null){
busta.setDigest(securityInfo.getDigestHeader());
Map<String, String> properties = securityInfo.getProperties();
if(properties!=null && !properties.isEmpty()) {
for (String key : properties.keySet()) {
busta.addProperty(key, properties.get(key)); // aggiungo le proprieta' di sicurezza riscontrate
}
}
}
traccia.setBusta(busta);
if(msg!=null){
try{
if(ServiceBinding.SOAP.equals(msg.getServiceBinding())){
// per motivi di streaming, se non e' costruito non lo tracciamo
if(msg.isContentBuilded() && msg.castAsSoap().hasAttachments()) {
java.util.Iterator<?> it = msg.castAsSoap().getAttachments();
while(it.hasNext()){
AttachmentPart ap =
(AttachmentPart) it.next();
Allegato allegato = new Allegato();
allegato.setContentId(ap.getContentId());
allegato.setContentLocation(ap.getContentLocation());
allegato.setContentType(ap.getContentType());
if(securityInfo!=null && ap.getContentId()!=null){
for (int i = 0; i < securityInfo.sizeListaAllegati(); i++) {
Allegato a = securityInfo.getAllegato(i);
if(a.getContentId()!=null && a.getContentId().equals(ap.getContentId())){
allegato.setDigest(a.getDigest());
}
}
}
traccia.addAllegato(allegato);
}
}
}
else if(MessageType.MIME_MULTIPART.equals(msg.getMessageType())){
// per motivi di streaming, se non e' costruito non lo tracciamo
if(msg.isContentBuilded()){
MultipartContent mc = msg.castAsRestMimeMultipart().getContent();
if(mc!=null) {
MimeMultipart mime = mc.getMimeMultipart();
if(mime!=null) {
for (int i = 0; i < mime.countBodyParts(); i++) {
BodyPart bodyPart = mime.getBodyPart(i);
String contentId = mime.getContentID(bodyPart);
if(contentId==null){
// provo a vedere se c'e' un disposition
contentId = mime.getContentDisposition(bodyPart);
}
Allegato allegato = new Allegato();
allegato.setContentId(contentId);
allegato.setContentLocation(mime.getContentLocation(bodyPart));
allegato.setContentType(bodyPart.getContentType());
if(securityInfo!=null && contentId!=null){
for (int j = 0; j < securityInfo.sizeListaAllegati(); j++) {
Allegato a = securityInfo.getAllegato(j);
if(a.getContentId()!=null && a.getContentId().equals(contentId)){
allegato.setDigest(a.getDigest());
}
}
}
traccia.addAllegato(allegato);
}
}
}
}
}
}catch(Exception e){
this.logError("errore durante la registrazione degli allegati nelle tracce", e);
}
}
if(this.pddContext!=null){
List<MapKey<String>> keys = org.openspcoop2.core.constants.Costanti.CONTEXT_OBJECT;
if(keys!=null){
for (int j = 0; j < keys.size(); j++) {
MapKey<String> mapKey = keys.get(j);
Object o = this.pddContext.getObject(mapKey);
if(o!=null && o instanceof String){
traccia.addProperty(mapKey.getValue(), (String)o);
}
}
}
}
return traccia;
}
private void gestioneErroreTracciamento(Exception e) throws TracciamentoException{
if(this.openspcoopProperties.isTracciaturaFallita_BloccoServiziPdD()){
Tracciamento.tracciamentoDisponibile=false;
Tracciamento.motivoMalfunzionamentoTracciamento=e;
try{
this.msgDiagErroreTracciamento.logPersonalizzato("errore.bloccoServizi");
}catch(Exception eMsg){
// ignore
}
logError("Il Sistema di tracciamento ha rilevato un errore durante la registrazione di una traccia legale,"+
" tutti i servizi/moduli della porta di dominio sono sospesi. Si richiede un intervento sistemistico per la risoluzione del problema "+
"e il riavvio di GovWay. Errore rilevato: ",e);
}
if(this.openspcoopProperties.isTracciaturaFallita_BloccaCooperazioneInCorso()){
throw new TracciamentoException(e);
}
}
private void logError(String msgErrore,Exception e){
if(OpenSPCoop2Logger.loggerOpenSPCoopCore!=null){
OpenSPCoop2Logger.loggerOpenSPCoopCore.error(msgErrore,e);
}
// Registro l'errore anche in questo logger.
if(OpenSPCoop2Logger.loggerOpenSPCoopResources!=null){
OpenSPCoop2Logger.loggerOpenSPCoopResources.error(msgErrore,e);
}
}
@SuppressWarnings("unused")
private void logError(String msgErrore){
if(OpenSPCoop2Logger.loggerOpenSPCoopCore!=null){
OpenSPCoop2Logger.loggerOpenSPCoopCore.error(msgErrore);
}
// Registro l'errore anche in questo logger.
if(OpenSPCoop2Logger.loggerOpenSPCoopResources!=null){
OpenSPCoop2Logger.loggerOpenSPCoopResources.error(msgErrore);
}
}
}