Dump.java

  1. /*
  2.  * GovWay - A customizable API Gateway
  3.  * https://govway.org
  4.  *
  5.  * Copyright (c) 2005-2025 Link.it srl (https://link.it).
  6.  *
  7.  * This program is free software: you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License version 3, as published by
  9.  * the Free Software Foundation.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  18.  *
  19.  */




  20. package org.openspcoop2.pdd.logger;

  21. import java.sql.Connection;
  22. import java.util.Date;
  23. import java.util.HashMap;
  24. import java.util.Iterator;
  25. import java.util.List;
  26. import java.util.Map;

  27. import org.openspcoop2.core.config.DumpConfigurazione;
  28. import org.openspcoop2.core.config.PortaApplicativa;
  29. import org.openspcoop2.core.config.PortaDelegata;
  30. import org.openspcoop2.core.config.Proprieta;
  31. import org.openspcoop2.core.config.constants.StatoFunzionalita;
  32. import org.openspcoop2.core.config.driver.DriverConfigurazioneException;
  33. import org.openspcoop2.core.constants.TipoPdD;
  34. import org.openspcoop2.core.id.IDPortaApplicativa;
  35. import org.openspcoop2.core.id.IDPortaDelegata;
  36. import org.openspcoop2.core.id.IDServizio;
  37. import org.openspcoop2.core.id.IDSoggetto;
  38. import org.openspcoop2.core.registry.driver.IDServizioFactory;
  39. import org.openspcoop2.core.transazioni.TransazioneApplicativoServer;
  40. import org.openspcoop2.core.transazioni.constants.TipoMessaggio;
  41. import org.openspcoop2.message.OpenSPCoop2Message;
  42. import org.openspcoop2.message.OpenSPCoop2MessageProperties;
  43. import org.openspcoop2.message.constants.MessageType;
  44. import org.openspcoop2.message.constants.ServiceBinding;
  45. import org.openspcoop2.message.exception.MessageException;
  46. import org.openspcoop2.message.rest.DumpRestMessageUtils;
  47. import org.openspcoop2.message.soap.DumpSoapMessageUtils;
  48. import org.openspcoop2.message.utils.DumpAttachment;
  49. import org.openspcoop2.message.utils.DumpMessaggio;
  50. import org.openspcoop2.message.utils.DumpMessaggioConfig;
  51. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  52. import org.openspcoop2.pdd.config.CostantiProprieta;
  53. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  54. import org.openspcoop2.pdd.core.CostantiPdD;
  55. import org.openspcoop2.pdd.core.PdDContext;
  56. import org.openspcoop2.pdd.core.connettori.InfoConnettoreUscita;
  57. import org.openspcoop2.pdd.core.transazioni.GestoreConsegnaMultipla;
  58. import org.openspcoop2.pdd.core.transazioni.RepositoryGestioneStateful;
  59. import org.openspcoop2.pdd.core.transazioni.Transaction;
  60. import org.openspcoop2.pdd.core.transazioni.TransactionContext;
  61. import org.openspcoop2.pdd.core.transazioni.TransactionDeletedException;
  62. import org.openspcoop2.pdd.core.transazioni.TransactionNotExistsException;
  63. import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
  64. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  65. import org.openspcoop2.protocol.sdk.dump.Attachment;
  66. import org.openspcoop2.protocol.sdk.dump.BodyMultipartInfo;
  67. import org.openspcoop2.protocol.sdk.dump.DumpException;
  68. import org.openspcoop2.protocol.sdk.dump.IDumpProducer;
  69. import org.openspcoop2.protocol.sdk.dump.Messaggio;
  70. import org.openspcoop2.protocol.sdk.state.IState;
  71. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  72. import org.openspcoop2.protocol.sdk.state.StateMessage;
  73. import org.openspcoop2.protocol.sdk.state.URLProtocolContext;
  74. import org.openspcoop2.protocol.sdk.tracciamento.TracciamentoException;
  75. import org.openspcoop2.utils.date.DateManager;
  76. import org.openspcoop2.utils.io.DumpByteArrayOutputStream;
  77. import org.openspcoop2.utils.transport.TransportUtils;
  78. import org.openspcoop2.utils.transport.http.HttpConstants;
  79. import org.slf4j.Logger;



  80. /**
  81.  * Contiene la definizione un Logger utilizzato dai nodi dell'infrastruttura di OpenSPCoop
  82.  * per la registrazione di messaggi diagnostici.
  83.  *
  84.  * @author Poli Andrea (apoli@link.it)
  85.  * @author $Author$
  86.  * @version $Rev$, $Date$
  87.  */

  88. public class Dump {

  89.     /** Indicazione di un dump funzionante */
  90.     private static boolean sistemaDumpDisponibile = true;
  91.     public static boolean isSistemaDumpDisponibile() {
  92.         return sistemaDumpDisponibile;
  93.     }
  94.     public static void setSistemaDumpDisponibile(boolean sistemaDumpDisponibile) {
  95.         Dump.sistemaDumpDisponibile = sistemaDumpDisponibile;
  96.     }

  97.     /** Primo errore avvenuto nel momento in cui รจ stato rilevato un malfunzionamento nel sistema di dump */
  98.     private static Throwable motivoMalfunzionamentoDump = null;
  99.     public static Throwable getMotivoMalfunzionamentoDump() {
  100.         return motivoMalfunzionamentoDump;
  101.     }
  102.     public static void setMotivoMalfunzionamentoDump(Throwable motivoMalfunzionamentoDump) {
  103.         Dump.motivoMalfunzionamentoDump = motivoMalfunzionamentoDump;
  104.     }
  105.    
  106.     private static final String DIAGNOSTICO_REGISTRAZIONE_NON_RIUSCITA = "dumpContenutiApplicativi.registrazioneNonRiuscita";
  107.    

  108.     /**  Logger log4j utilizzato per effettuare un dump dei messaggi applicativi */
  109.     private Logger loggerDump = null;
  110.     private void loggerDumpError(String msg) {
  111.         if(this.loggerDump!=null) {
  112.             this.loggerDump.error(msg);
  113.         }
  114.     }
  115.     private void loggerDumpError(String msg, Throwable e) {
  116.         if(this.loggerDump!=null) {
  117.             this.loggerDump.error(msg,e);
  118.         }
  119.     }
  120.    
  121.     private void loggerOpenSPCoopResourcesError(String msg, Throwable e) {
  122.         if(OpenSPCoop2Logger.loggerOpenSPCoopResources!=null) {
  123.             OpenSPCoop2Logger.loggerOpenSPCoopResources.error(msg,e);
  124.         }
  125.     }
  126.    
  127.    
  128.    
  129.     /** Soggetto che richiede il logger */
  130.     private IDSoggetto dominio;
  131.     /** Modulo Funzionale */
  132.     private String idModulo;
  133.     /** Identificativo del Messaggio */
  134.     private String idMessaggio;
  135.     /** Fruitore */
  136.     private IDSoggetto fruitore;
  137.     /** Servizio */
  138.     private IDServizio servizio;
  139.     /** Signature */
  140.     private String signature;
  141.     /** GDO */
  142.     private Date gdo;
  143.     /** TipoPdD */
  144.     private TipoPdD tipoPdD;
  145.     private String nomePorta;
  146.     /** PdDContext */
  147.     private PdDContext pddContext;
  148.     /** RequestInfo */
  149.     private RequestInfo requestInfo = null;
  150.    
  151.     /** OpenSPCoopProperties */
  152.     private OpenSPCoop2Properties properties = null;

  153.     /** MsgDiagnostico per eventuali errori di tracciamento (viene usato anche per registrare il dump in corso e completato) */
  154.     private MsgDiagnostico msgDiagErroreDump = null;
  155.     private boolean emitDiagnosticDump = false;
  156.    
  157.     /** Appender personalizzati per i dump applicativi di OpenSPCoop */
  158.     private List<IDumpProducer> loggerDumpOpenSPCoopAppender = null;
  159.     private List<String> tipoDumpOpenSPCoopAppender = null;
  160.    
  161.     private DumpConfigurazione dumpConfigurazione;
  162.    
  163.     private IProtocolFactory<?> protocolFactory = null;
  164.     private String idTransazione = null;
  165.    
  166.     /** Stati */
  167.     private StateMessage statoRichiesta;
  168.     private StateMessage statoRisposta;
  169.    
  170.     /** Transaction */
  171.     private Transaction transactionNullable = null;
  172.    
  173.     /** -----------------Impostazione TransazioneApplicativoServer ---------------- */
  174.     private TransazioneApplicativoServer transazioneApplicativoServer;
  175.     private IDPortaApplicativa idPortaApplicativa;
  176.     private Date dataConsegnaTransazioneApplicativoServer;
  177.     public void setTransazioneApplicativoServer(TransazioneApplicativoServer transazioneApplicativoServer, IDPortaApplicativa idPortaApplicativa, Date dataConsegnaTransazioneApplicativoServer) {
  178.         this.transazioneApplicativoServer = transazioneApplicativoServer;
  179.         this.idPortaApplicativa = idPortaApplicativa;
  180.         this.dataConsegnaTransazioneApplicativoServer = dataConsegnaTransazioneApplicativoServer;
  181.     }
  182.    
  183.     /**
  184.      * Costruttore.
  185.      *
  186.      * @param dominio Soggetto che richiede il logger
  187.      * @param modulo Funzione che richiede il logger
  188.      * @param pddContext pddContext
  189.      *
  190.      */
  191.     public Dump(IDSoggetto dominio, String modulo, TipoPdD tipoPdD, String nomePorta, PdDContext pddContext, DumpConfigurazione dumpConfigurazione) throws DumpException{ // dump binario
  192.         this(dominio, modulo, null, null, null, tipoPdD, nomePorta, pddContext,null,null,dumpConfigurazione);
  193.     }
  194.     public Dump(IDSoggetto dominio, String modulo, TipoPdD tipoPdD, String nomePorta, PdDContext pddContext,IState statoRichiesta,IState statoRisposta,
  195.             DumpConfigurazione dumpConfigurazione) throws DumpException{
  196.         this(dominio, modulo, null, null, null, tipoPdD, nomePorta, pddContext,statoRichiesta,statoRisposta,dumpConfigurazione);
  197.     }
  198.     public Dump(IDSoggetto dominio, String modulo, String idMessaggio, IDSoggetto fruitore, IDServizio servizio,
  199.             TipoPdD tipoPdD, String nomePorta, PdDContext pddContext,IState stateParam,IState responseStateParam,
  200.             DumpConfigurazione dumpConfigurazione) throws DumpException{
  201.         this.dominio = dominio;
  202.         this.idModulo = modulo;
  203.         this.idMessaggio = idMessaggio;
  204.         this.fruitore = fruitore;
  205.         this.servizio = servizio;
  206.         this.loggerDump = OpenSPCoop2Logger.loggerDump;
  207.         this.loggerDumpOpenSPCoopAppender = OpenSPCoop2Logger.loggerDumpOpenSPCoopAppender;
  208.         this.tipoDumpOpenSPCoopAppender = OpenSPCoop2Logger.tipoDumpOpenSPCoopAppender;
  209.         this.gdo = DateManager.getDate();
  210.         if(this.dominio!=null)
  211.             this.signature = this.dominio.getCodicePorta()+" <"+this.gdo+"> "+this.idModulo+"\n";
  212.         else
  213.             this.signature = "<"+this.gdo+"> "+this.idModulo+"\n";
  214.         this.tipoPdD = tipoPdD;
  215.         this.nomePorta = nomePorta;
  216.         this.pddContext = pddContext;
  217.         if(this.pddContext==null) {
  218.             throw new DumpException("PdDContext is null");
  219.         }
  220.        
  221.         this.properties = OpenSPCoop2Properties.getInstance();
  222.         if(stateParam instanceof StateMessage){
  223.             this.statoRichiesta = (StateMessage) stateParam;
  224.         }
  225.         if(responseStateParam instanceof StateMessage){
  226.             this.statoRisposta = (StateMessage) responseStateParam;
  227.         }
  228.        
  229.         OpenSPCoop2Properties op2Properties = OpenSPCoop2Properties.getInstance();
  230.        
  231.         this.dumpConfigurazione = dumpConfigurazione;
  232.        
  233.         if(this.pddContext.containsKey(org.openspcoop2.core.constants.Costanti.REQUEST_INFO)) {
  234.             this.requestInfo = (RequestInfo) this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
  235.         }
  236.        
  237.         this.msgDiagErroreDump = MsgDiagnostico.newInstance(this.tipoPdD,dominio,modulo,nomePorta,this.requestInfo,this.statoRichiesta,this.statoRisposta);
  238.         this.msgDiagErroreDump.setPrefixMsgPersonalizzati(MsgDiagnosticiProperties.MSG_DIAG_TRACCIAMENTO);
  239.         this.emitDiagnosticDump = op2Properties.isDumpEmitDiagnostic();
  240.        
  241.         this.idTransazione = (String) this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE);
  242.        
  243.         // Protocol Factory Manager
  244.         String protocol = null;
  245.         try{
  246.             this.protocolFactory = ProtocolFactoryManager.getInstance().getProtocolFactoryByName((String) this.pddContext.getObject(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME));
  247.             protocol = this.protocolFactory.getProtocol();
  248.             this.msgDiagErroreDump.setPddContext(this.pddContext, this.protocolFactory);
  249.         }catch (Exception e) {
  250.             throw new DumpException("Errore durante l'inizializzazione del ProtocolFactoryManager...",e);
  251.         }
  252.         if(this.dominio==null){
  253.             this.dominio=op2Properties.getIdentitaPortaDefault(protocol, this.requestInfo);
  254.         }
  255.        
  256.         try{
  257.             if(this.idTransazione!=null) {
  258.                 this.transactionNullable = TransactionContext.getTransaction(this.idTransazione);
  259.             }
  260.         }catch(Exception e){
  261.             // La transazione potrebbe essere stata eliminata nelle comunicazioni stateful
  262.         }
  263.     }
  264.    
  265.     private Connection getConnectionFromState(boolean richiesta){
  266.         if(richiesta){
  267.             Connection c = StateMessage.getConnection(this.statoRichiesta);
  268.             if(c!=null) {
  269.                 return c;
  270.             }
  271.         }
  272.         else{
  273.             Connection c = StateMessage.getConnection(this.statoRisposta);
  274.             if(c!=null) {
  275.                 return c;
  276.             }
  277.         }
  278.         return null;
  279.     }






  280.     /** ----------------- METODI DI LOGGING  ---------------- */
  281.     public void emitDiagnosticStartDumpBinarioRichiestaIngresso(boolean onlyFileTrace) {
  282.         emitDiagnosticDumpStart(TipoMessaggio.RICHIESTA_INGRESSO_DUMP_BINARIO, onlyFileTrace);
  283.     }
  284.     public void dumpBinarioRichiestaIngresso(boolean dumpBinarioRegistrazioneDatabase, boolean onlyLogFileTraceHeaders, boolean onlyLogFileTraceBody,
  285.             DumpByteArrayOutputStream msg, MessageType messageType,
  286.             URLProtocolContext protocolContext) throws DumpException {
  287.         if(this.transactionNullable!=null) {
  288.             this.transactionNullable.getTempiElaborazione().startDumpBinarioRichiestaIngresso();
  289.         }
  290.         try {
  291.             dump(dumpBinarioRegistrazioneDatabase, onlyLogFileTraceHeaders, onlyLogFileTraceBody, TipoMessaggio.RICHIESTA_INGRESSO_DUMP_BINARIO,
  292.                     null,msg,messageType,
  293.                     protocolContext!=null ? protocolContext.getSource() : null,
  294.                     protocolContext!=null ? protocolContext.getHeaders() : null);
  295.         }
  296.         finally {
  297.             if(this.transactionNullable!=null) {
  298.                 this.transactionNullable.getTempiElaborazione().endDumpBinarioRichiestaIngresso();
  299.             }
  300.         }
  301.     }
  302.    
  303.     public void dumpRichiestaIngresso(OpenSPCoop2Message msg, URLProtocolContext protocolContext) throws DumpException {
  304.         if(this.transactionNullable!=null) {
  305.             this.transactionNullable.getTempiElaborazione().startDumpRichiestaIngresso();
  306.         }
  307.         try {
  308.             dump(false, false, false, TipoMessaggio.RICHIESTA_INGRESSO,
  309.                     msg,null,null,
  310.                     protocolContext!=null ? protocolContext.getSource() : null,
  311.                     protocolContext!=null ? protocolContext.getHeaders() : null);
  312.         }
  313.         finally {
  314.             if(this.transactionNullable!=null) {
  315.                 this.transactionNullable.getTempiElaborazione().endDumpRichiestaIngresso();
  316.             }
  317.         }
  318.     }
  319.     public void dumpRichiestaIngressoByIntegrationManagerError(byte[] msg, URLProtocolContext protocolContext) throws DumpException {
  320.         if(this.transactionNullable!=null) {
  321.             this.transactionNullable.getTempiElaborazione().startDumpRichiestaIngresso();
  322.         }
  323.         try {
  324.             dump(false, false, false, TipoMessaggio.RICHIESTA_INGRESSO,
  325.                     null,DumpByteArrayOutputStream.newInstance(msg),null,
  326.                     protocolContext!=null ? protocolContext.getSource() : null,
  327.                     protocolContext!=null ? protocolContext.getHeaders() : null);
  328.         }
  329.         finally {
  330.             if(this.transactionNullable!=null) {
  331.                 this.transactionNullable.getTempiElaborazione().endDumpRichiestaIngresso();
  332.             }
  333.         }
  334.     }
  335.    
  336.     public void emitDiagnosticStartDumpBinarioRichiestaUscita(boolean onlyFileTrace) {
  337.         emitDiagnosticDumpStart(TipoMessaggio.RICHIESTA_USCITA_DUMP_BINARIO, onlyFileTrace);
  338.     }
  339.     public void dumpBinarioRichiestaUscita(boolean dumpBinarioRegistrazioneDatabase, boolean onlyLogFileTraceHeaders, boolean onlyLogFileTraceBody,
  340.             DumpByteArrayOutputStream msg, MessageType messageType,
  341.             InfoConnettoreUscita infoConnettore) throws DumpException {
  342.         if(this.transactionNullable!=null) {
  343.             this.transactionNullable.getTempiElaborazione().startDumpBinarioRichiestaUscita();
  344.         }
  345.         try {
  346.             dump(dumpBinarioRegistrazioneDatabase, onlyLogFileTraceHeaders, onlyLogFileTraceBody, TipoMessaggio.RICHIESTA_USCITA_DUMP_BINARIO,
  347.                     null,msg,messageType,
  348.                     (infoConnettore!=null ? infoConnettore.getLocation() : null),
  349.                     (infoConnettore!=null ? infoConnettore.getHeaders() : null));
  350.         }
  351.         finally {
  352.             if(this.transactionNullable!=null) {
  353.                 this.transactionNullable.getTempiElaborazione().endDumpBinarioRichiestaUscita();
  354.             }
  355.         }
  356.     }
  357.     public void dumpRichiestaUscita(OpenSPCoop2Message msg, InfoConnettoreUscita infoConnettore) throws DumpException {
  358.         if(this.transactionNullable!=null) {
  359.             this.transactionNullable.getTempiElaborazione().startDumpRichiestaUscita();
  360.         }
  361.         try {
  362.             dump(false, false, false, TipoMessaggio.RICHIESTA_USCITA,
  363.                     msg,null,null,
  364.                     (infoConnettore!=null ? infoConnettore.getLocation() : null),
  365.                     (infoConnettore!=null ? infoConnettore.getHeaders() : null));
  366.         }
  367.         finally {
  368.             if(this.transactionNullable!=null) {
  369.                 this.transactionNullable.getTempiElaborazione().endDumpRichiestaUscita();
  370.             }
  371.         }
  372.     }

  373.     public void emitDiagnosticStartDumpBinarioRispostaIngresso(boolean onlyFileTrace) {
  374.         emitDiagnosticDumpStart(TipoMessaggio.RISPOSTA_INGRESSO_DUMP_BINARIO, onlyFileTrace);
  375.     }
  376.     public void dumpBinarioRispostaIngresso(boolean dumpBinarioRegistrazioneDatabase, boolean onlyLogFileTraceHeaders, boolean onlyLogFileTraceBody,
  377.             DumpByteArrayOutputStream msg, MessageType messageType,
  378.             InfoConnettoreUscita infoConnettore, Map<String, List<String>> transportHeaderRisposta) throws DumpException {
  379.         if(this.transactionNullable!=null) {
  380.             this.transactionNullable.getTempiElaborazione().startDumpBinarioRispostaIngresso();
  381.         }
  382.         try {
  383.             dump(dumpBinarioRegistrazioneDatabase, onlyLogFileTraceHeaders, onlyLogFileTraceBody, TipoMessaggio.RISPOSTA_INGRESSO_DUMP_BINARIO,
  384.                     null,msg,messageType,
  385.                     (infoConnettore!=null ? infoConnettore.getLocation() : null),transportHeaderRisposta);
  386.         }
  387.         finally {
  388.             if(this.transactionNullable!=null) {
  389.                 this.transactionNullable.getTempiElaborazione().endDumpBinarioRispostaIngresso();
  390.             }
  391.         }
  392.     }
  393.    
  394.     public void dumpRispostaIngresso(OpenSPCoop2Message msg, InfoConnettoreUscita infoConnettore, Map<String, List<String>> transportHeaderRisposta) throws DumpException {
  395.         if(this.transactionNullable!=null) {
  396.             this.transactionNullable.getTempiElaborazione().startDumpRispostaIngresso();
  397.         }
  398.         try {
  399.             dump(false, false, false, TipoMessaggio.RISPOSTA_INGRESSO,
  400.                     msg,null,null,
  401.                     (infoConnettore!=null ? infoConnettore.getLocation() : null),transportHeaderRisposta);
  402.         }
  403.         finally {
  404.             if(this.transactionNullable!=null) {
  405.                 this.transactionNullable.getTempiElaborazione().endDumpRispostaIngresso();
  406.             }
  407.         }
  408.     }
  409.    

  410.     public void emitDiagnosticStartDumpBinarioRispostaUscita(boolean onlyFileTrace) {
  411.         emitDiagnosticDumpStart(TipoMessaggio.RISPOSTA_USCITA_DUMP_BINARIO, onlyFileTrace);
  412.     }
  413.     public void dumpBinarioRispostaUscita(boolean dumpBinarioRegistrazioneDatabase, boolean onlyLogFileTraceHeaders, boolean onlyLogFileTraceBody,
  414.             DumpByteArrayOutputStream msg, MessageType messageType,
  415.             URLProtocolContext protocolContext, Map<String, List<String>> transportHeaderRisposta) throws DumpException {
  416.         if(this.transactionNullable!=null) {
  417.             this.transactionNullable.getTempiElaborazione().startDumpBinarioRispostaUscita();
  418.         }
  419.         try {
  420.             dump(dumpBinarioRegistrazioneDatabase, onlyLogFileTraceHeaders, onlyLogFileTraceBody, TipoMessaggio.RISPOSTA_USCITA_DUMP_BINARIO,
  421.                     null,msg,messageType,
  422.                     protocolContext!=null ? protocolContext.getSource() : null,transportHeaderRisposta);
  423.         }
  424.         finally {
  425.             if(this.transactionNullable!=null) {
  426.                 this.transactionNullable.getTempiElaborazione().endDumpBinarioRispostaUscita();
  427.             }
  428.         }
  429.     }
  430.    
  431.     public void dumpRispostaUscita(OpenSPCoop2Message msg, URLProtocolContext protocolContext, Map<String, List<String>> transportHeaderRisposta) throws DumpException {
  432.         if(this.transactionNullable!=null) {
  433.             this.transactionNullable.getTempiElaborazione().startDumpRispostaUscita();
  434.         }
  435.         try {
  436.             dump(false, false, false, TipoMessaggio.RISPOSTA_USCITA,
  437.                     msg,null,null,
  438.                     protocolContext!=null ? protocolContext.getSource() : null,transportHeaderRisposta);
  439.         }
  440.         finally {
  441.             if(this.transactionNullable!=null) {
  442.                 this.transactionNullable.getTempiElaborazione().endDumpRispostaUscita();
  443.             }
  444.         }
  445.     }
  446.    

  447.     public void dumpIntegrationManagerGetMessage(OpenSPCoop2Message msg) throws DumpException {
  448.         if(this.transactionNullable!=null) {
  449.             this.transactionNullable.getTempiElaborazione().startDumpIntegrationManager();
  450.         }
  451.         try {
  452.             dump(false, false, false, TipoMessaggio.INTEGRATION_MANAGER,
  453.                     msg,null,null,
  454.                     "IntegrationManager.getMessage()",null);
  455.         }
  456.         finally {
  457.             if(this.transactionNullable!=null) {
  458.                 this.transactionNullable.getTempiElaborazione().endDumpIntegrationManager();
  459.             }
  460.         }
  461.     }
  462.    
  463.     /**
  464.      * Il Metodo si occupa di creare un effettuare un dump del messaggio applicativo.
  465.      *
  466.      * @param msg Messaggio da registrare
  467.      * @throws TracciamentoException
  468.      *
  469.      */
  470.     private void dump(boolean dumpBinarioRegistrazioneDatabase, boolean onlyLogFileTraceHeaders, boolean onlyLogFileTraceBody,
  471.             TipoMessaggio tipoMessaggio,OpenSPCoop2Message msg,DumpByteArrayOutputStream msgBytes, MessageType messageType,
  472.             String location,Map<String, List<String>> transportHeaderParam) throws DumpException {

  473.         boolean dumpNormale = TipoMessaggio.RICHIESTA_INGRESSO.equals(tipoMessaggio) ||
  474.                 TipoMessaggio.RICHIESTA_USCITA.equals(tipoMessaggio) ||
  475.                 TipoMessaggio.RISPOSTA_INGRESSO.equals(tipoMessaggio) ||
  476.                 TipoMessaggio.RISPOSTA_USCITA.equals(tipoMessaggio);
  477.        
  478.         boolean dumpBinario = TipoMessaggio.RICHIESTA_INGRESSO_DUMP_BINARIO.equals(tipoMessaggio) ||
  479.                 TipoMessaggio.RICHIESTA_USCITA_DUMP_BINARIO.equals(tipoMessaggio) ||
  480.                 TipoMessaggio.RISPOSTA_INGRESSO_DUMP_BINARIO.equals(tipoMessaggio) ||
  481.                 TipoMessaggio.RISPOSTA_USCITA_DUMP_BINARIO.equals(tipoMessaggio);
  482.        
  483.         boolean dumpIntegrationManager = TipoMessaggio.INTEGRATION_MANAGER.equals(tipoMessaggio);
  484.        
  485.        
  486.         if(dumpNormale) {
  487.             if(this.dumpConfigurazione==null) {
  488.                 return; // disabilitato
  489.             }
  490.             if(this.dumpConfigurazione!=null && StatoFunzionalita.DISABILITATO.equals(this.dumpConfigurazione.getRealtime())) {
  491.                 return; // viene gestito tramite l'handler notify
  492.             }
  493.         }
  494.                
  495.         boolean dumpHeaders = true;
  496.         boolean dumpBody = true;
  497.         boolean dumpAttachments = true;
  498.         if(dumpBinario) {
  499.             dumpAttachments = false;
  500.         }
  501.         boolean dumpBinarioAttivatoTramiteRegolaConfigurazione = false;
  502.        
  503.         if(dumpNormale) {
  504.             // Il dump non binario si utilizza solo se viene richiesto un payload parsing, altrimenti quello binario รจ piรน preciso (anche se sono abilitati solo gli header)
  505.             if(TipoMessaggio.RICHIESTA_INGRESSO.equals(tipoMessaggio)) {
  506.                 if(this.dumpConfigurazione!=null && this.dumpConfigurazione.getRichiestaIngresso()!=null) {
  507.                     if(StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRichiestaIngresso().getPayload()) &&
  508.                             StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRichiestaIngresso().getPayloadParsing())){
  509.                         dumpHeaders = StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRichiestaIngresso().getHeaders());
  510.                         dumpBody = StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRichiestaIngresso().getBody());
  511.                         dumpAttachments = StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRichiestaIngresso().getAttachments());      
  512.                     }
  513.                     else {
  514.                         dumpHeaders = false;
  515.                         dumpBody = false;
  516.                         dumpAttachments = false;
  517.                     }
  518.                 }
  519.             }
  520.             else if(TipoMessaggio.RICHIESTA_USCITA.equals(tipoMessaggio)) {
  521.                 if(this.dumpConfigurazione!=null && this.dumpConfigurazione.getRichiestaUscita()!=null) {
  522.                     if(StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRichiestaUscita().getPayload()) &&
  523.                             StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRichiestaUscita().getPayloadParsing())){
  524.                         dumpHeaders = StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRichiestaUscita().getHeaders());
  525.                         dumpBody = StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRichiestaUscita().getBody());
  526.                         dumpAttachments = StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRichiestaUscita().getAttachments());
  527.                     }
  528.                     else {
  529.                         dumpHeaders = false;
  530.                         dumpBody = false;
  531.                         dumpAttachments = false;
  532.                     }
  533.                 }
  534.             }
  535.             else if(TipoMessaggio.RISPOSTA_INGRESSO.equals(tipoMessaggio)) {
  536.                 if(this.dumpConfigurazione!=null && this.dumpConfigurazione.getRispostaIngresso()!=null) {
  537.                     if(StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRispostaIngresso().getPayload()) &&
  538.                             StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRispostaIngresso().getPayloadParsing())){
  539.                         dumpHeaders = StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRispostaIngresso().getHeaders());
  540.                         dumpBody = StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRispostaIngresso().getBody());
  541.                         dumpAttachments = StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRispostaIngresso().getAttachments());
  542.                     }
  543.                     else {
  544.                         dumpHeaders = false;
  545.                         dumpBody = false;
  546.                         dumpAttachments = false;
  547.                     }
  548.                 }
  549.             }
  550.             else if(TipoMessaggio.RISPOSTA_USCITA.equals(tipoMessaggio) &&
  551.                 this.dumpConfigurazione!=null && this.dumpConfigurazione.getRispostaUscita()!=null) {
  552.                 if(StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRispostaUscita().getPayload()) &&
  553.                         StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRispostaUscita().getPayloadParsing())){
  554.                     dumpHeaders = StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRispostaUscita().getHeaders());
  555.                     dumpBody = StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRispostaUscita().getBody());
  556.                     dumpAttachments = StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRispostaUscita().getAttachments());
  557.                 }
  558.                 else {
  559.                     dumpHeaders = false;
  560.                     dumpBody = false;
  561.                     dumpAttachments = false;
  562.                 }
  563.             }
  564.             if(!dumpHeaders && !dumpBody && !dumpAttachments) {
  565.                 return; // disabilitato
  566.             }
  567.         }
  568.         else if(dumpBinario) {
  569.            
  570.             if(dumpBinarioRegistrazioneDatabase) {
  571.                 // registro tutto
  572.             }
  573.             else {
  574.                    
  575.                 // imposto a false; verifico poi regola specifica e faccio successivamente verifica per file trace
  576.                 dumpHeaders = false;
  577.                 dumpBody = false;
  578.                
  579.                 // Il dump non binario si utilizza solo se viene richiesto un payload parsing, altrimenti quello binario รจ piรน preciso (anche se sono abilitati solo gli header)
  580.                 if(TipoMessaggio.RICHIESTA_INGRESSO_DUMP_BINARIO.equals(tipoMessaggio)) {
  581.                     if(this.dumpConfigurazione!=null && this.dumpConfigurazione.getRichiestaIngresso()!=null) {
  582.                         boolean payloadParsing = StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRichiestaIngresso().getPayload()) &&
  583.                                 StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRichiestaIngresso().getPayloadParsing());
  584.                         if(!payloadParsing) {
  585.                             dumpHeaders = StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRichiestaIngresso().getHeaders());
  586.                             dumpBody = StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRichiestaIngresso().getPayload());
  587.                             dumpBinarioAttivatoTramiteRegolaConfigurazione = dumpHeaders || dumpBody;
  588.                         }
  589.                     }
  590.                 }
  591.                 else if(TipoMessaggio.RICHIESTA_USCITA_DUMP_BINARIO.equals(tipoMessaggio)) {
  592.                     if(this.dumpConfigurazione!=null && this.dumpConfigurazione.getRichiestaUscita()!=null) {
  593.                         boolean payloadParsing = StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRichiestaUscita().getPayload()) &&
  594.                                 StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRichiestaUscita().getPayloadParsing());
  595.                         if(!payloadParsing) {
  596.                             dumpHeaders = StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRichiestaUscita().getHeaders());
  597.                             dumpBody = StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRichiestaUscita().getPayload());
  598.                             dumpBinarioAttivatoTramiteRegolaConfigurazione = dumpHeaders || dumpBody;
  599.                         }
  600.                     }
  601.                 }
  602.                 else if(TipoMessaggio.RISPOSTA_INGRESSO_DUMP_BINARIO.equals(tipoMessaggio)) {
  603.                     if(this.dumpConfigurazione!=null && this.dumpConfigurazione.getRispostaIngresso()!=null) {
  604.                         boolean payloadParsing = StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRispostaIngresso().getPayload()) &&
  605.                                 StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRispostaIngresso().getPayloadParsing());
  606.                         if(!payloadParsing) {
  607.                             dumpHeaders = StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRispostaIngresso().getHeaders());
  608.                             dumpBody = StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRispostaIngresso().getPayload());
  609.                             dumpBinarioAttivatoTramiteRegolaConfigurazione = dumpHeaders || dumpBody;
  610.                         }
  611.                     }
  612.                 }
  613.                 else if(TipoMessaggio.RISPOSTA_USCITA_DUMP_BINARIO.equals(tipoMessaggio) &&
  614.                     this.dumpConfigurazione!=null && this.dumpConfigurazione.getRispostaUscita()!=null) {
  615.                     boolean payloadParsing = StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRispostaUscita().getPayload()) &&
  616.                             StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRispostaUscita().getPayloadParsing());
  617.                     if(!payloadParsing) {
  618.                         dumpHeaders = StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRispostaUscita().getHeaders());
  619.                         dumpBody = StatoFunzionalita.ABILITATO.equals(this.dumpConfigurazione.getRispostaUscita().getPayload());
  620.                         dumpBinarioAttivatoTramiteRegolaConfigurazione = dumpHeaders || dumpBody;
  621.                     }
  622.                 }
  623.             }
  624.            
  625.             if(!dumpHeaders && !dumpBody && !dumpAttachments && !onlyLogFileTraceHeaders && !onlyLogFileTraceBody) {
  626.                 return; // disabilitato
  627.             }
  628.         }
  629.         boolean dumpMultipartHeaders = dumpHeaders;
  630.        
  631.         String identificativoDiagnostico = null;
  632.         if(dumpNormale) {
  633.             identificativoDiagnostico = emitDiagnosticDumpStart(tipoMessaggio, false);
  634.         }
  635.         else {
  636.             boolean onlyFileTrace = !dumpHeaders && !dumpBody && !dumpAttachments;
  637.            
  638.             identificativoDiagnostico = getIdentificativoDiagnostico(tipoMessaggio, onlyFileTrace);
  639.         }
  640.        
  641.         try {
  642.             dumpEngine(onlyLogFileTraceHeaders, onlyLogFileTraceBody,
  643.                     tipoMessaggio, msg, msgBytes, messageType,
  644.                     location, transportHeaderParam,
  645.                     dumpHeaders, dumpBody, dumpAttachments, dumpMultipartHeaders,
  646.                     dumpIntegrationManager,
  647.                     dumpBinario, dumpBinarioAttivatoTramiteRegolaConfigurazione);
  648.         }finally {
  649.             if(identificativoDiagnostico!=null && this.emitDiagnosticDump) {
  650.                 try {
  651.                     if(this.transazioneApplicativoServer!=null && this.idPortaApplicativa!=null) {
  652.                         this.msgDiagErroreDump.setTransazioneApplicativoServer(this.transazioneApplicativoServer, this.idPortaApplicativa);
  653.                     }
  654.                     this.msgDiagErroreDump.logPersonalizzato(identificativoDiagnostico+"completato");
  655.                 }catch(Exception t) {
  656.                     if(this.loggerDump!=null) {
  657.                         this.loggerDumpError("Riscontrato errore durante l'emissione del diagnostico per il dump del contenuto applicativo in corso del messaggio ("+tipoMessaggio+
  658.                                 ") "+getLogIdTransazione()+":"+t.getMessage(),t);
  659.                     }
  660.                 }finally {
  661.                     this.msgDiagErroreDump.setTransazioneApplicativoServer(null, null);
  662.                 }
  663.             }
  664.         }
  665.     }
  666.    
  667.     private String getIdentificativoDiagnostico(TipoMessaggio tipoMessaggio, boolean onlyFileTrace) {
  668.         String identificativoDiagnostico = null;
  669.         if(tipoMessaggio!=null) {
  670.             switch (tipoMessaggio) {
  671.             case RICHIESTA_INGRESSO:
  672.             case RICHIESTA_INGRESSO_DUMP_BINARIO:
  673.                 if(onlyFileTrace) {
  674.                     identificativoDiagnostico = "dumpContenutiApplicativiFileTrace.richiestaIngresso.";
  675.                 }
  676.                 else {
  677.                     identificativoDiagnostico = "dumpContenutiApplicativi.richiestaIngresso.";
  678.                 }
  679.                 break;
  680.             case RICHIESTA_USCITA:
  681.             case RICHIESTA_USCITA_DUMP_BINARIO:
  682.                 if(onlyFileTrace) {
  683.                     identificativoDiagnostico = "dumpContenutiApplicativiFileTrace.richiestaUscita.";
  684.                 }
  685.                 else {
  686.                     identificativoDiagnostico = "dumpContenutiApplicativi.richiestaUscita.";
  687.                 }
  688.                 break;
  689.             case RISPOSTA_INGRESSO:
  690.             case RISPOSTA_INGRESSO_DUMP_BINARIO:
  691.                 if(onlyFileTrace) {
  692.                     identificativoDiagnostico = "dumpContenutiApplicativiFileTrace.rispostaIngresso.";
  693.                 }
  694.                 else {
  695.                     identificativoDiagnostico = "dumpContenutiApplicativi.rispostaIngresso.";
  696.                 }
  697.                 break;
  698.             case RISPOSTA_USCITA:
  699.             case RISPOSTA_USCITA_DUMP_BINARIO:
  700.                 if(onlyFileTrace) {
  701.                     identificativoDiagnostico = "dumpContenutiApplicativiFileTrace.rispostaUscita.";
  702.                 }
  703.                 else {
  704.                     identificativoDiagnostico = "dumpContenutiApplicativi.rispostaUscita.";
  705.                 }
  706.                 break;
  707.             default:
  708.                 break;
  709.             }
  710.         }
  711.         return identificativoDiagnostico;
  712.     }
  713.    
  714.     private String emitDiagnosticDumpStart(TipoMessaggio tipoMessaggio, boolean onlyFileTrace) {
  715.         String identificativoDiagnostico = getIdentificativoDiagnostico(tipoMessaggio, onlyFileTrace);
  716.         emitDiagnosticDumpStart(tipoMessaggio, identificativoDiagnostico);
  717.         return identificativoDiagnostico;
  718.     }
  719.     private void emitDiagnosticDumpStart(TipoMessaggio tipoMessaggio, String identificativoDiagnostico) {
  720.         if(identificativoDiagnostico!=null && this.emitDiagnosticDump) {
  721.             try {
  722.                 if(this.transazioneApplicativoServer!=null && this.idPortaApplicativa!=null) {
  723.                     this.msgDiagErroreDump.setTransazioneApplicativoServer(this.transazioneApplicativoServer, this.idPortaApplicativa);
  724.                 }
  725.                 this.msgDiagErroreDump.logPersonalizzato(identificativoDiagnostico+"inCorso");
  726.             }catch(Exception t) {
  727.                 if(this.loggerDump!=null) {
  728.                     this.loggerDumpError("Riscontrato errore durante l'emissione del diagnostico per il dump del contenuto applicativo in corso del messaggio ("+tipoMessaggio+
  729.                             ") "+getLogIdTransazione()+":"+t.getMessage(),t);
  730.                 }
  731.             }finally {
  732.                 this.msgDiagErroreDump.setTransazioneApplicativoServer(null, null);
  733.             }
  734.         }
  735.     }
  736.    
  737.    
  738.     private List<String> initDumpWhiteHeaderList(TipoMessaggio tipoMessaggio) {
  739.         return initDumpHeaderList(true, tipoMessaggio);
  740.     }
  741.     private List<String> initDumpBlackHeaderList(TipoMessaggio tipoMessaggio) {
  742.         return initDumpHeaderList(false, tipoMessaggio);
  743.     }
  744.     private List<String> initDumpHeaderList(boolean whiteList, TipoMessaggio tipoMessaggio) {
  745.        
  746.         List<String> l = initDumpHeaderPorta(whiteList, tipoMessaggio);
  747.         if(l!=null && !l.isEmpty()) {
  748.             return l;
  749.         }
  750.                
  751.         if(this.tipoPdD!=null && tipoMessaggio!=null) {
  752.             l = initDumpHeaderListRequestResponse(whiteList, tipoMessaggio);
  753.             if(l!=null && !l.isEmpty()) {
  754.                 return l;
  755.             }
  756.         }
  757.        
  758.         if(this.tipoPdD!=null) {
  759.             l = initDumpHeaderList(whiteList,
  760.                     this.properties.getDumpHeaderErogazioniWhiteList(),
  761.                     this.properties.getDumpHeaderErogazioniBlackList(),
  762.                     this.properties.getDumpHeaderFruizioniWhiteList(),
  763.                     this.properties.getDumpHeaderFruizioniBlackList());
  764.             if(l!=null && !l.isEmpty()) {
  765.                 return l;
  766.             }
  767.         }
  768.        
  769.         return whiteList ? this.properties.getDumpHeaderWhiteList() : this.properties.getDumpHeaderBlackList();
  770.     }
  771.     private List<Proprieta> getProprietaPortaList() throws DriverConfigurazioneException{
  772.         List<Proprieta> lReturn = null;
  773.         if(this.tipoPdD!=null && this.nomePorta!=null) {
  774.            
  775.             ConfigurazionePdDManager configPdDManager = ConfigurazionePdDManager.getInstance(this.statoRichiesta!=null ? this.statoRichiesta : this.statoRisposta);
  776.            
  777.             if(TipoPdD.APPLICATIVA.equals(this.tipoPdD)) {
  778.                 IDPortaApplicativa idPA = new IDPortaApplicativa();
  779.                 idPA.setNome(this.nomePorta);
  780.                 PortaApplicativa pa = configPdDManager.getPortaApplicativaSafeMethod(idPA, this.requestInfo);
  781.                 if(pa!=null) {
  782.                     return pa.getProprieta();
  783.                 }
  784.             }
  785.             else if(TipoPdD.DELEGATA.equals(this.tipoPdD)) {
  786.                 IDPortaDelegata idPD = new IDPortaDelegata();
  787.                 idPD.setNome(this.nomePorta);
  788.                 PortaDelegata pd = configPdDManager.getPortaDelegataSafeMethod(idPD, this.requestInfo);
  789.                 if(pd!=null) {
  790.                     return pd.getProprieta();
  791.                 }
  792.             }
  793.            
  794.         }
  795.         return lReturn;
  796.     }
  797.     private List<String> initDumpHeaderPorta(boolean whiteList, TipoMessaggio tipoMessaggio) {
  798.        
  799.         List<String> l = null;
  800.        
  801.         List<Proprieta> portaProps = null;
  802.         try {
  803.             portaProps = getProprietaPortaList();
  804.         }catch(Exception e) {
  805.             this.loggerDumpError("Recupero proprietร  dalla porta '"+this.nomePorta+"' (tipo: "+this.tipoPdD+") fallito: "+e.getMessage(),e);
  806.         }
  807.        
  808.         if(portaProps!=null && !portaProps.isEmpty()) {
  809.            
  810.             l = initDumpHeaderListRequestResponsePorta(whiteList, tipoMessaggio, portaProps);
  811.             if(l!=null && !l.isEmpty()) {
  812.                 return l;
  813.             }
  814.            
  815.             List<String> white = CostantiProprieta.getRegistrazioneMessaggiWhiteList(portaProps);
  816.             List<String> black = CostantiProprieta.getRegistrazioneMessaggiBlackList(portaProps);
  817.             l = initDumpHeaderList(whiteList,
  818.                     white,
  819.                     black,
  820.                     white,
  821.                     black);
  822.             if(l!=null && !l.isEmpty()) {
  823.                 return l;
  824.             }
  825.            
  826.         }
  827.        
  828.         return l;
  829.     }
  830.     private List<String> initDumpHeaderListRequestResponsePorta(boolean whiteList, TipoMessaggio tipoMessaggio, List<Proprieta> proprieta) {
  831.         List<String> l = null;
  832.        
  833.         if(this.tipoPdD!=null && tipoMessaggio!=null) {
  834.             switch (tipoMessaggio) {
  835.            
  836.             case RICHIESTA_INGRESSO:
  837.             case RICHIESTA_INGRESSO_DUMP_BINARIO:{
  838.                 List<String> white = CostantiProprieta.getRegistrazioneMessaggiRichiestaIngressoWhiteList(proprieta);
  839.                 List<String> black = CostantiProprieta.getRegistrazioneMessaggiRichiestaIngressoBlackList(proprieta);
  840.                 l = initDumpHeaderList(whiteList,
  841.                         white,
  842.                         black,
  843.                         white,
  844.                         black);
  845.                 break;
  846.             }
  847.             case RICHIESTA_USCITA:
  848.             case RICHIESTA_USCITA_DUMP_BINARIO:{
  849.                 List<String> white = CostantiProprieta.getRegistrazioneMessaggiRichiestaUscitaWhiteList(proprieta);
  850.                 List<String> black = CostantiProprieta.getRegistrazioneMessaggiRichiestaUscitaBlackList(proprieta);
  851.                 l = initDumpHeaderList(whiteList,
  852.                         white,
  853.                         black,
  854.                         white,
  855.                         black);
  856.                 break;
  857.             }
  858.             case RISPOSTA_INGRESSO:
  859.             case RISPOSTA_INGRESSO_DUMP_BINARIO:{
  860.                 List<String> white = CostantiProprieta.getRegistrazioneMessaggiRispostaIngressoWhiteList(proprieta);
  861.                 List<String> black = CostantiProprieta.getRegistrazioneMessaggiRispostaIngressoBlackList(proprieta);
  862.                 l = initDumpHeaderList(whiteList,
  863.                         white,
  864.                         black,
  865.                         white,
  866.                         black);
  867.                 break;
  868.             }
  869.    
  870.             case RISPOSTA_USCITA:
  871.             case RISPOSTA_USCITA_DUMP_BINARIO:{
  872.                 List<String> white = CostantiProprieta.getRegistrazioneMessaggiRispostaUscitaWhiteList(proprieta);
  873.                 List<String> black = CostantiProprieta.getRegistrazioneMessaggiRispostaUscitaBlackList(proprieta);
  874.                 l = initDumpHeaderList(whiteList,
  875.                         white,
  876.                         black,
  877.                         white,
  878.                         black);
  879.                 break;
  880.             }
  881.                
  882.             default:
  883.                 break;
  884.             }
  885.         }
  886.         return l;
  887.     }
  888.     private List<String> initDumpHeaderListRequestResponse(boolean whiteList, TipoMessaggio tipoMessaggio) {
  889.        
  890.         List<String> l = null;
  891.        
  892.         if(this.tipoPdD!=null && tipoMessaggio!=null) {
  893.             switch (tipoMessaggio) {
  894.            
  895.             case RICHIESTA_INGRESSO:
  896.             case RICHIESTA_INGRESSO_DUMP_BINARIO:
  897.                 l = initDumpHeaderList(whiteList,
  898.                         this.properties.getDumpHeaderErogazioniRichiestaIngressoWhiteList(),
  899.                         this.properties.getDumpHeaderErogazioniRichiestaIngressoBlackList(),
  900.                         this.properties.getDumpHeaderFruizioniRichiestaIngressoWhiteList(),
  901.                         this.properties.getDumpHeaderFruizioniRichiestaIngressoBlackList());
  902.                 break;
  903.    
  904.             case RICHIESTA_USCITA:
  905.             case RICHIESTA_USCITA_DUMP_BINARIO:
  906.                 l = initDumpHeaderList(whiteList,
  907.                         this.properties.getDumpHeaderErogazioniRichiestaUscitaWhiteList(),
  908.                         this.properties.getDumpHeaderErogazioniRichiestaUscitaBlackList(),
  909.                         this.properties.getDumpHeaderFruizioniRichiestaUscitaWhiteList(),
  910.                         this.properties.getDumpHeaderFruizioniRichiestaUscitaBlackList());
  911.                 break;
  912.                
  913.             case RISPOSTA_INGRESSO:
  914.             case RISPOSTA_INGRESSO_DUMP_BINARIO:
  915.                 l = initDumpHeaderList(whiteList,
  916.                         this.properties.getDumpHeaderErogazioniRispostaIngressoWhiteList(),
  917.                         this.properties.getDumpHeaderErogazioniRispostaIngressoBlackList(),
  918.                         this.properties.getDumpHeaderFruizioniRispostaIngressoWhiteList(),
  919.                         this.properties.getDumpHeaderFruizioniRispostaIngressoBlackList());
  920.                 break;
  921.    
  922.             case RISPOSTA_USCITA:
  923.             case RISPOSTA_USCITA_DUMP_BINARIO:
  924.                 l = initDumpHeaderList(whiteList,
  925.                         this.properties.getDumpHeaderErogazioniRispostaUscitaWhiteList(),
  926.                         this.properties.getDumpHeaderErogazioniRispostaUscitaBlackList(),
  927.                         this.properties.getDumpHeaderFruizioniRispostaUscitaWhiteList(),
  928.                         this.properties.getDumpHeaderFruizioniRispostaUscitaBlackList());
  929.                 break;
  930.                
  931.             default:
  932.                 break;
  933.             }
  934.         }
  935.         return l;
  936.     }
  937.     private List<String> initDumpHeaderList(boolean whiteList, List<String> erogazioniWhiteList, List<String> erogazioniBlackList, List<String> fruizioniWhiteList, List<String> fruizioniBlackList){
  938.         List<String> l = null;
  939.         if(TipoPdD.APPLICATIVA.equals(this.tipoPdD)) {
  940.             l = whiteList ? erogazioniWhiteList : erogazioniBlackList;
  941.         }
  942.         else if(TipoPdD.DELEGATA.equals(this.tipoPdD)) {
  943.             l = whiteList ? fruizioniWhiteList : fruizioniBlackList;
  944.         }
  945.         return l;
  946.     }
  947.    
  948.    
  949.     private void dumpEngine(boolean onlyLogFileTraceHeaders, boolean onlyLogFileTraceBody,
  950.             TipoMessaggio tipoMessaggio,OpenSPCoop2Message msg,DumpByteArrayOutputStream msgBytes, MessageType messageType,
  951.             String location,Map<String, List<String>> transportHeaderParam,
  952.             boolean dumpHeaders, boolean dumpBody, boolean dumpAttachments, boolean dumpMultipartHeaders,
  953.             boolean dumpIntegrationManager,
  954.             boolean dumpBinario, boolean dumpBinarioAttivatoTramiteRegolaConfigurazione) throws DumpException {
  955.        
  956.        
  957.         Messaggio messaggio = new Messaggio();
  958.         if(this.protocolFactory!=null) {
  959.             messaggio.setProtocollo(this.protocolFactory.getProtocol());
  960.         }
  961.         messaggio.setTipoMessaggio(tipoMessaggio);
  962.         if(msg!=null) {
  963.             messaggio.setFormatoMessaggio(msg.getMessageType());
  964.         }
  965.         else if(messageType!=null) {
  966.             messaggio.setFormatoMessaggio(messageType);
  967.         }
  968.        
  969.         messaggio.setGdo(DateManager.getDate());
  970.        
  971.         messaggio.setDominio(this.dominio);
  972.         messaggio.setTipoPdD(this.tipoPdD);
  973.         messaggio.setIdFunzione(this.idModulo);
  974.        
  975.         messaggio.setIdTransazione(this.idTransazione);
  976.         messaggio.setIdBusta(this.idMessaggio);
  977.         messaggio.setFruitore(this.fruitore);
  978.         messaggio.setServizio(this.servizio);
  979.        
  980.         if(this.protocolFactory!=null) {
  981.             messaggio.setProtocollo(this.protocolFactory.getProtocol());
  982.         }
  983.        
  984.        
  985.        
  986.         // HEADERS
  987.         Map<String, List<String>> transportHeader = new HashMap<>(); // uso anche sotto per content type in caso msg bytes
  988.         try{
  989.             if(transportHeaderParam!=null && transportHeaderParam.size()>0){
  990.                 transportHeader.putAll(transportHeaderParam);
  991.             }
  992.             if(msg!=null){
  993.                 OpenSPCoop2MessageProperties forwardHeader = null;
  994.                 if(TipoMessaggio.RICHIESTA_USCITA.equals(tipoMessaggio)){
  995.                     if(ServiceBinding.REST.equals(msg.getServiceBinding())) {
  996.                         forwardHeader = msg.getForwardTransportHeader(this.properties.getRESTServicesHeadersForwardConfig(true));
  997.                     }
  998.                     else {
  999.                         forwardHeader = msg.getForwardTransportHeader(this.properties.getSOAPServicesHeadersForwardConfig(true));
  1000.                     }
  1001.                 }
  1002.                 else if(TipoMessaggio.RISPOSTA_USCITA.equals(tipoMessaggio)){
  1003.                     if(ServiceBinding.REST.equals(msg.getServiceBinding())) {
  1004.                         forwardHeader = msg.getForwardTransportHeader(this.properties.getRESTServicesHeadersForwardConfig(false));
  1005.                     }
  1006.                     else {
  1007.                         forwardHeader = msg.getForwardTransportHeader(this.properties.getSOAPServicesHeadersForwardConfig(false));
  1008.                     }
  1009.                 }
  1010.                 if(forwardHeader!=null && forwardHeader.size()>0){
  1011.                     Iterator<String> enHdr = forwardHeader.getKeys();
  1012.                     while (enHdr.hasNext()) {
  1013.                         String key = enHdr.next();
  1014.                         if(key!=null){
  1015.                             List<String> values = forwardHeader.getPropertyValues(key);
  1016.                             if(values!=null && !values.isEmpty()){
  1017.                                 transportHeader.put(key, values);
  1018.                             }
  1019.                         }
  1020.                     }
  1021.                 }
  1022.             }
  1023.             if(msg!=null &&
  1024.                     !TransportUtils.containsKey(transportHeader, HttpConstants.CONTENT_TYPE)) {
  1025.                 String contentType = msg.getContentType();
  1026.                 if(contentType!=null) {
  1027.                     TransportUtils.setHeader(transportHeader, HttpConstants.CONTENT_TYPE, contentType);
  1028.                 }
  1029.             }
  1030.         }catch(Exception e){
  1031.             // Registro solo l'errore sul file dump.log
  1032.             // Si tratta di un errore che non dovrebbe mai avvenire
  1033.             String messaggioErrore = "Riscontrato errore durante la lettura degli header di trasporto del contenuto applicativo presente nel messaggio ("+tipoMessaggio+
  1034.                     ") "+getLogIdTransazione()+":"+e.getMessage();
  1035.             this.loggerDumpError(messaggioErrore);
  1036.             OpenSPCoop2Logger.getLoggerOpenSPCoopCore().error(messaggioErrore);
  1037.         }
  1038.         if( (dumpHeaders || onlyLogFileTraceHeaders) &&
  1039.             (transportHeader!=null && transportHeader.size()>0)
  1040.             ){
  1041.                
  1042.             List<String> filterList = null;
  1043.             boolean white = false;
  1044.            
  1045.             List<String> dumpHeaderWhiteList = initDumpWhiteHeaderList(tipoMessaggio);
  1046.             List<String> dumpHeaderBlackList = initDumpBlackHeaderList(tipoMessaggio);
  1047.            
  1048.             if(dumpHeaderWhiteList!=null && !dumpHeaderWhiteList.isEmpty()) {
  1049.                 filterList = dumpHeaderWhiteList;
  1050.                 white = true;
  1051.             }
  1052.             else if(dumpHeaderBlackList!=null && !dumpHeaderBlackList.isEmpty()) {
  1053.                 filterList = dumpHeaderBlackList;
  1054.                 white = false;
  1055.             }
  1056.            
  1057.             Iterator<String> keys = transportHeader.keySet().iterator();
  1058.             while (keys.hasNext()) {
  1059.                 String key = keys.next();                  
  1060.                 if(key!=null){
  1061.                    
  1062.                     boolean add = false;
  1063.                     if(filterList!=null) {
  1064.                         boolean find = false;
  1065.                         for (String filterHdr : filterList) {
  1066.                             if(filterHdr.equalsIgnoreCase(key)) {
  1067.                                 find = true;
  1068.                                 break;
  1069.                             }
  1070.                         }
  1071.                         if(white) {
  1072.                             if(find) {
  1073.                                 add = true;
  1074.                             }
  1075.                         }
  1076.                         else {
  1077.                             if(!find) {
  1078.                                 add = true;
  1079.                             }
  1080.                         }
  1081.                     }
  1082.                     else {
  1083.                         add = true;
  1084.                     }
  1085.                    
  1086.                     if(add) {
  1087.                         List<String> values = transportHeader.get(key);
  1088.                         messaggio.getHeaders().put(key, values);
  1089.                     }
  1090.                 }
  1091.             }
  1092.         }
  1093.        
  1094.        
  1095.        
  1096.        
  1097.         // BODY e ATTACHMENTS
  1098.         DumpMessaggio dumpMessaggio = null;
  1099.         DumpMessaggioConfig dumpMessaggioConfig = null;
  1100.         try {
  1101.             if( (dumpBody || onlyLogFileTraceBody)
  1102.                     ||
  1103.                 dumpAttachments
  1104.                 ) {
  1105.                 if(msg!=null){
  1106.                     dumpMessaggioConfig = new DumpMessaggioConfig();
  1107.                     dumpMessaggio = fillMessaggio(msg, dumpMessaggioConfig,
  1108.                             dumpBody, dumpAttachments, dumpMultipartHeaders,
  1109.                             messaggio);
  1110.                 }
  1111.                 else {
  1112.                    
  1113.                     if( dumpBody || onlyLogFileTraceBody ) {
  1114.                    
  1115.                         if(transportHeader!=null && !transportHeader.isEmpty()) {
  1116.                             Iterator<String> keys = transportHeader.keySet().iterator();
  1117.                             while (keys.hasNext()) {
  1118.                                 String key = keys.next();
  1119.                                 if(HttpConstants.CONTENT_TYPE.equalsIgnoreCase(key)){
  1120.                                     List<String> values = transportHeader.get(key);
  1121.                                     if(values!=null && !values.isEmpty()) {
  1122.                                         messaggio.setContentType(values.get(0));
  1123.                                     }
  1124.                                     break;
  1125.                                 }
  1126.                             }
  1127.                         }
  1128.                        
  1129.                         messaggio.setBody(msgBytes);
  1130.                     }
  1131.                 }
  1132.             }
  1133.         }catch(Exception e){
  1134.             try{
  1135.                 // Registro l'errore sul file dump.log
  1136.                 this.loggerDumpError("Riscontrato errore durante la preparazione al dump del contenuto applicativo presente nel messaggio ("+tipoMessaggio+
  1137.                         ") "+getLogIdTransazione()+":"+e.getMessage());
  1138.             }catch(Exception eLog){
  1139.                 // ignore
  1140.             }
  1141.             loggerOpenSPCoopResourcesError("Errore durante la preparazione al dump del contenuto applicativo presente nel messaggio ("+tipoMessaggio+
  1142.                     ") "+getLogIdTransazione()+": "+e.getMessage(),e);
  1143.             try{
  1144.                 this.msgDiagErroreDump.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, tipoMessaggio.getValue());
  1145.                 this.msgDiagErroreDump.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
  1146.                 this.msgDiagErroreDump.logPersonalizzato(DIAGNOSTICO_REGISTRAZIONE_NON_RIUSCITA);
  1147.             }catch(Exception eMsg){
  1148.                 // ignore
  1149.             }
  1150.             gestioneErroreDump(e);
  1151.         }
  1152.        
  1153.        
  1154.        
  1155.        
  1156.        
  1157.         // TransazioneContext
  1158.         if(this.properties.isTransazioniSaveDumpInUniqueTransaction() || onlyLogFileTraceBody || onlyLogFileTraceHeaders) {
  1159.            
  1160.            
  1161.             if(this.transazioneApplicativoServer!=null) {
  1162.                 try {
  1163.                     // forzo
  1164.                     messaggio.setIdTransazione(this.transazioneApplicativoServer.getIdTransazione());
  1165.                     messaggio.setServizioApplicativoErogatore(this.transazioneApplicativoServer.getServizioApplicativoErogatore());
  1166.                     messaggio.setDataConsegna(this.dataConsegnaTransazioneApplicativoServer);
  1167.                     GestoreConsegnaMultipla.getInstance().safeSave(messaggio, this.idPortaApplicativa, this.statoRichiesta!=null ? this.statoRichiesta : this.statoRisposta, this.requestInfo, this.pddContext);
  1168.                 }catch(Exception t) {
  1169.                     String msgError = "Errore durante il salvataggio delle informazioni relative al servizio applicativo: "+t.getMessage();
  1170.                     this.loggerDumpError(msgError,t);
  1171.                     loggerOpenSPCoopResourcesError(msgError,t);
  1172.                     try{
  1173.                         this.msgDiagErroreDump.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, tipoMessaggio.getValue());
  1174.                         this.msgDiagErroreDump.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,t.getMessage());
  1175.                         this.msgDiagErroreDump.logPersonalizzato(DIAGNOSTICO_REGISTRAZIONE_NON_RIUSCITA);
  1176.                     }catch(Exception eMsg){
  1177.                         // ignore
  1178.                     }
  1179.                     gestioneErroreDump(t);
  1180.                 }
  1181.             }
  1182.             else {
  1183.            
  1184.                 Exception exc = null;
  1185.                 boolean gestioneStateful = false;
  1186.                 try {
  1187.                     Transaction tr = TransactionContext.getTransaction(this.idTransazione);
  1188.                     if(messaggio.getBody()!=null) {
  1189.                         messaggio.getBody().lock();
  1190.                     }
  1191.                     tr.addMessaggio(messaggio, onlyLogFileTraceHeaders, onlyLogFileTraceBody);
  1192.                 }catch(TransactionDeletedException | TransactionNotExistsException e){
  1193.                     gestioneStateful = true;
  1194.                 }catch(Exception e){
  1195.                     exc = e;
  1196.                 }
  1197.                 if(gestioneStateful && !dumpIntegrationManager){
  1198.                     try{
  1199.                         /**System.out.println("@@@@@REPOSITORY@@@@@ LOG DUMP ID TRANSAZIONE ["+idTransazione+"] ADD");*/
  1200.                         RepositoryGestioneStateful.addMessaggio(this.idTransazione, messaggio);
  1201.                     }catch(Exception e){
  1202.                         exc = e;
  1203.                     }
  1204.                 }
  1205.                 if(exc!=null) {
  1206.                     try{
  1207.                         // Registro l'errore sul file dump.log
  1208.                         this.loggerDumpError("Riscontrato errore durante la registrazione, nel contesto della transazione, del dump del contenuto applicativo presente nel messaggio ("+tipoMessaggio+
  1209.                                 ") "+getLogIdTransazione()+":"+exc.getMessage());
  1210.                     }catch(Exception eLog){
  1211.                         // ignore
  1212.                     }
  1213.                     loggerOpenSPCoopResourcesError("Errore durante la registrazione, nel contesto della transazione, del contenuto applicativo presente nel messaggio ("+tipoMessaggio+
  1214.                             ") "+getLogIdTransazione()+": "+exc.getMessage(),exc);
  1215.                     try{
  1216.                         this.msgDiagErroreDump.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, tipoMessaggio.getValue());
  1217.                         this.msgDiagErroreDump.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,exc.getMessage());
  1218.                         this.msgDiagErroreDump.logPersonalizzato(DIAGNOSTICO_REGISTRAZIONE_NON_RIUSCITA);
  1219.                     }catch(Exception eMsg){
  1220.                         // ignore
  1221.                     }
  1222.                     gestioneErroreDump(exc);
  1223.                 }
  1224.                
  1225.             }
  1226.         }
  1227.        
  1228.         // Log4J
  1229.         if(OpenSPCoop2Logger.loggerDumpAbilitato &&
  1230.                 (!dumpBinario || dumpBinarioAttivatoTramiteRegolaConfigurazione) // Se attivato da console deve finire in dump.log
  1231.                 ){
  1232.             // Su file di log, il log binario viene registrato in altra maniera sul file openspcoop2_connettori.log
  1233.             try{
  1234.                 StringBuilder out = new StringBuilder();
  1235.                 out.append(this.signature);
  1236.                 out.append("TipoMessaggio:"+tipoMessaggio.getValue());
  1237.                
  1238.                 if(this.idTransazione!=null){
  1239.                     out.append(" idTransazione:");
  1240.                     out.append(this.idTransazione);
  1241.                 }
  1242.                
  1243.                 if(this.idMessaggio!=null){
  1244.                     out.append(" idMessaggio:");
  1245.                     out.append(this.idMessaggio);
  1246.                 }
  1247.                
  1248.                 if(location!=null){
  1249.                     if(TipoMessaggio.RICHIESTA_INGRESSO.equals(tipoMessaggio) || TipoMessaggio.RISPOSTA_USCITA.equals(tipoMessaggio)){
  1250.                         out.append(" source:");
  1251.                     }else{
  1252.                         out.append(" location:");
  1253.                     }
  1254.                     out.append(location);
  1255.                 }
  1256.                
  1257.                 if( this.fruitore!=null ){
  1258.                     out.append(" FR:");
  1259.                     out.append(this.fruitore.toString());
  1260.                 }
  1261.                 if( this.fruitore!=null && this.servizio!=null)
  1262.                     out.append(" -> ");
  1263.                 if( this.servizio!=null ){
  1264.                     if(this.servizio.getNome()!=null){
  1265.                         out.append(" S:");
  1266.                         try{
  1267.                             out.append(IDServizioFactory.getInstance().getUriFromIDServizio(this.servizio));
  1268.                         }catch(Exception e){
  1269.                             out.append(this.servizio.toString(false));
  1270.                         }
  1271.                     }else if(this.servizio.getSoggettoErogatore()!=null){
  1272.                         out.append(" ER:");
  1273.                         out.append(this.servizio.getSoggettoErogatore().toString());
  1274.                     }
  1275.                 }
  1276.                
  1277.                 out.append(" \n");
  1278.                
  1279.                 // HEADER
  1280.                
  1281.                 if(dumpHeaders) {
  1282.                     out.append("------ Header di trasporto ------\n");
  1283.                     if(messaggio.getHeaders()!=null && messaggio.getHeaders().size()>0) {
  1284.                         Iterator<?> it = messaggio.getHeaders().keySet().iterator();
  1285.                         while (it.hasNext()) {
  1286.                             String key = (String) it.next();
  1287.                             if(key!=null){
  1288.                                 List<String> values = messaggio.getHeaders().get(key);
  1289.                                 if(values!=null && !values.isEmpty()) {
  1290.                                     for (String value : values) {
  1291.                                         out.append("- "+key+": "+value+"\n");
  1292.                                     }
  1293.                                 }
  1294.                             }
  1295.                         }
  1296.                     }
  1297.                     else {
  1298.                         out.append("Non presenti\n");
  1299.                     }
  1300.                 }
  1301.                
  1302.                 // BODY e ATTACHMENTS
  1303.                
  1304.                 if(dumpBody || dumpAttachments) {
  1305.                     if(msg!=null){
  1306.    
  1307.                         if(dumpAttachments && !this.properties.isDumpAllAttachments()) {
  1308.                             // Ricalcolo gli attachments prendendo solo quelli stampabili
  1309.                             if(ServiceBinding.SOAP.equals(msg.getServiceBinding())){
  1310.                                 dumpMessaggio = DumpSoapMessageUtils.dumpMessage(msg.castAsSoap(), dumpMessaggioConfig, false);
  1311.                             }
  1312.                             else{
  1313.                                 dumpMessaggio = DumpRestMessageUtils.dumpMessage(msg.castAsRest(), dumpMessaggioConfig, false);
  1314.                             }
  1315.                         }
  1316.                        
  1317.                         if(dumpMessaggio!=null) {
  1318.                             out.append(dumpMessaggio.toString(dumpMessaggioConfig,this.properties.isDumpAllAttachments()));
  1319.                         }
  1320.    
  1321.                     }else{
  1322.                         if(msgBytes!=null && msgBytes.size()>0) {
  1323.                             if(org.openspcoop2.utils.mime.MultipartUtils.messageWithAttachment(msgBytes.toByteArray())){
  1324.                                 out.append("------ MessageWithAttachments ------\n");
  1325.                             }else{
  1326.                                 out.append("------ Message ------\n");
  1327.                             }
  1328.                             out.append(msgBytes.toString());
  1329.                         }
  1330.                         else {
  1331.                             out.append("------ Message ------\n");
  1332.                             out.append("Non presente\n");
  1333.                         }
  1334.                     }
  1335.                
  1336.                 }
  1337.                
  1338.                 String msgDump = out.toString();
  1339.                 this.loggerDump.info(msgDump);
  1340.                
  1341.             }catch(Exception e){
  1342.                 try{
  1343.                     // Registro l'errore sul file dump.log
  1344.                     this.loggerDumpError("Riscontrato errore durante il dump su file di log del contenuto applicativo presente nel messaggio ("+tipoMessaggio+
  1345.                             ") "+getLogIdTransazione()+":"+e.getMessage());
  1346.                 }catch(Exception eLog){
  1347.                     // ignore
  1348.                 }
  1349.                 loggerOpenSPCoopResourcesError("Errore durante il dump su file di log del contenuto applicativo presente nel messaggio ("+tipoMessaggio+
  1350.                         ") "+getLogIdTransazione()+": "+e.getMessage(),e);
  1351.                 try{
  1352.                     this.msgDiagErroreDump.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, tipoMessaggio.getValue());
  1353.                     this.msgDiagErroreDump.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
  1354.                     this.msgDiagErroreDump.logPersonalizzato(DIAGNOSTICO_REGISTRAZIONE_NON_RIUSCITA);
  1355.                 }catch(Exception eMsg){
  1356.                     // ignore
  1357.                 }
  1358.                 gestioneErroreDump(e);
  1359.             }
  1360.         }
  1361.        
  1362.         // Il dump via API lo effettuo solamente se ho davvero un messaggio OpenSPCoop
  1363.         // Senno ottengo errori all'interno delle implementazioni degli appender dump
  1364.         boolean onlyLogFileTrace = false;
  1365.         if( (onlyLogFileTraceHeaders && !dumpHeaders)
  1366.                 ||
  1367.             (onlyLogFileTraceBody && !dumpBody) ) {
  1368.             onlyLogFileTrace=true;
  1369.         }
  1370.         if(!onlyLogFileTrace && !dumpIntegrationManager) {
  1371.             for(int i=0; i<this.loggerDumpOpenSPCoopAppender.size();i++){
  1372.                 try{
  1373.                     boolean headersCompact = false; //non supportato nei plugins
  1374.                     this.loggerDumpOpenSPCoopAppender.get(i).dump(getConnectionFromState(false),messaggio,headersCompact);
  1375.                 }catch(Exception e){
  1376.                     loggerOpenSPCoopResourcesError("Errore durante il dump personalizzato ["+this.tipoDumpOpenSPCoopAppender.get(i)+
  1377.                             "] del contenuto applicativo presente nel messaggio ("+tipoMessaggio+") "+getLogIdTransazione()+": "+e.getMessage(),e);
  1378.                     try{
  1379.                         this.msgDiagErroreDump.addKeyword(CostantiPdD.KEY_TRACCIA_TIPO, tipoMessaggio.getValue());
  1380.                         this.msgDiagErroreDump.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_ERRORE,e.getMessage());
  1381.                         this.msgDiagErroreDump.addKeyword(CostantiPdD.KEY_TRACCIAMENTO_PERSONALIZZATO,this.tipoDumpOpenSPCoopAppender.get(i));
  1382.                         this.msgDiagErroreDump.logPersonalizzato("dumpContenutiApplicativi.registrazioneNonRiuscita.openspcoopAppender");
  1383.                     }catch(Exception eMsg){
  1384.                         // ignore
  1385.                     }
  1386.                     gestioneErroreDump(e);
  1387.                 }
  1388.             }
  1389.         }

  1390.     }
  1391.    
  1392.     public static DumpMessaggio fillMessaggio(OpenSPCoop2Message msg, DumpMessaggioConfig dumpMessaggioConfig,
  1393.             boolean dumpBody, boolean dumpAttachments, boolean dumpMultipartHeaders,
  1394.             Messaggio messaggio) throws MessageException  {
  1395.            
  1396.         DumpMessaggio dumpMessaggio = null;
  1397.        
  1398.         dumpMessaggioConfig.setDumpBody(dumpBody);
  1399.         dumpMessaggioConfig.setDumpHeaders(false); // utilizzo sempre quello fornito poiche' per il raw il msg openspcoop2 non e' disponibile, altrimenti perche' devo considerare i forward header
  1400.         dumpMessaggioConfig.setDumpAttachments(dumpAttachments);
  1401.         dumpMessaggioConfig.setDumpMultipartHeaders(dumpMultipartHeaders);
  1402.        
  1403.         if(ServiceBinding.SOAP.equals(msg.getServiceBinding())){
  1404.             dumpMessaggio = DumpSoapMessageUtils.dumpMessage(msg.castAsSoap(), dumpMessaggioConfig, true); /**!Devo leggere tutti gli attachments! this.properties.isDumpAllAttachments());*/
  1405.         }
  1406.         else{
  1407.             dumpMessaggio = DumpRestMessageUtils.dumpMessage(msg.castAsRest(), dumpMessaggioConfig, true); /**!Devo leggere tutti gli attachments! this.properties.isDumpAllAttachments());*/
  1408.         }
  1409.        
  1410.         messaggio.setContentType(dumpMessaggio.getContentType());
  1411.        
  1412.         if(dumpBody) {
  1413.             messaggio.setBody(DumpByteArrayOutputStream.newInstance(dumpMessaggio.getBody()));
  1414.             if(dumpMessaggio.getMultipartInfoBody()!=null) {
  1415.                 BodyMultipartInfo bodyMultipartInfo = new BodyMultipartInfo();
  1416.                
  1417.                 bodyMultipartInfo.setContentId(dumpMessaggio.getMultipartInfoBody().getContentId());
  1418.                 bodyMultipartInfo.setContentLocation(dumpMessaggio.getMultipartInfoBody().getContentLocation());
  1419.                 bodyMultipartInfo.setContentType(dumpMessaggio.getMultipartInfoBody().getContentType());
  1420.                
  1421.                 if(dumpMultipartHeaders &&
  1422.                     dumpMessaggio.getMultipartInfoBody().getHeadersValues()!=null &&
  1423.                     dumpMessaggio.getMultipartInfoBody().getHeadersValues().size()>0) {
  1424.                     Iterator<?> it = dumpMessaggio.getMultipartInfoBody().getHeadersValues().keySet().iterator();
  1425.                     while (it.hasNext()) {
  1426.                         String key = (String) it.next();
  1427.                         List<String> values = dumpMessaggio.getMultipartInfoBody().getHeadersValues().get(key);
  1428.                         bodyMultipartInfo.getHeaders().put(key, values);
  1429.                     }
  1430.                 }
  1431.                
  1432.                 messaggio.setBodyMultipartInfo(bodyMultipartInfo);
  1433.             }
  1434.         }
  1435.        
  1436.         if(dumpAttachments && dumpMessaggio.getAttachments()!=null &&
  1437.                 !dumpMessaggio.getAttachments().isEmpty()) {
  1438.             for (DumpAttachment dumpAttach : dumpMessaggio.getAttachments()) {
  1439.                
  1440.                 Attachment attachment = new Attachment();
  1441.                
  1442.                 attachment.setContentId(dumpAttach.getContentId());
  1443.                 attachment.setContentLocation(dumpAttach.getContentLocation());
  1444.                 attachment.setContentType(dumpAttach.getContentType());
  1445.                
  1446.                 if(dumpMultipartHeaders &&
  1447.                     dumpAttach.getHeadersValues()!=null &&
  1448.                     dumpAttach.getHeadersValues().size()>0) {
  1449.                     Iterator<?> it = dumpAttach.getHeadersValues().keySet().iterator();
  1450.                     while (it.hasNext()) {
  1451.                         String key = (String) it.next();
  1452.                         List<String> values = dumpAttach.getHeadersValues().get(key);
  1453.                         attachment.getHeaders().put(key, values);
  1454.                     }
  1455.                 }
  1456.                
  1457.                 if(dumpAttach.getContent()!=null)
  1458.                     attachment.setContent(dumpAttach.getContent());
  1459.                 else if(dumpAttach.getErrorContentNotSerializable()!=null)
  1460.                     attachment.setContent(dumpAttach.getErrorContentNotSerializable().getBytes());
  1461.                 else
  1462.                     throw new MessageException("Contenuto dell'attachment con id '"+attachment.getContentId()+"' non presente ?");
  1463.                
  1464.                 messaggio.getAttachments().add(attachment);
  1465.             }
  1466.         }
  1467.        
  1468.         return dumpMessaggio;
  1469.     }

  1470.    
  1471.     private void gestioneErroreDump(Throwable e) throws DumpException{
  1472.        
  1473.         if(this.properties.isDumpFallitoBloccoServiziPdD()){
  1474.             Dump.setSistemaDumpDisponibile(false);
  1475.             Dump.setMotivoMalfunzionamentoDump(e);
  1476.             try{
  1477.                 this.msgDiagErroreDump.logPersonalizzato("dumpContenutiApplicativi.errore.bloccoServizi");
  1478.             }catch(Exception eMsg){
  1479.                 // ignore
  1480.             }
  1481.             loggerOpenSPCoopResourcesError("Il Sistema di dump dei contenuti applicativi ha rilevato un errore "+
  1482.                     "durante la registrazione di un contenuto applicativo, tutti i servizi/moduli della porta di dominio sono sospesi."+
  1483.                     " Si richiede un intervento sistemistico per la risoluzione del problema e il riavvio di GovWay. "+
  1484.                     "Errore rilevato: ",e);
  1485.         }
  1486.        
  1487.         if(this.properties.isDumpFallitoBloccaCooperazioneInCorso()){
  1488.             throw new DumpException(e);
  1489.         }
  1490.     }
  1491.    
  1492.     private String getLogIdTransazione() {
  1493.         return "con identificativo di transazione ["+this.idTransazione+"]";
  1494.     }
  1495. }