TransactionServiceLibrary.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.monitor.engine.config;

  21. import java.io.Serializable;
  22. import java.util.ArrayList;
  23. import java.util.HashMap;
  24. import java.util.List;
  25. import java.util.Map;

  26. import javax.xml.soap.SOAPEnvelope;

  27. import org.openspcoop2.core.commons.dao.DAOFactory;
  28. import org.openspcoop2.core.transazioni.DumpContenuto;
  29. import org.openspcoop2.core.transazioni.DumpMessaggio;
  30. import org.openspcoop2.core.transazioni.Transazione;
  31. import org.openspcoop2.message.OpenSPCoop2Message;
  32. import org.openspcoop2.message.constants.MessageType;
  33. import org.openspcoop2.message.xml.MessageDynamicNamespaceContextFactory;
  34. import org.openspcoop2.monitor.engine.config.transazioni.ConfigurazioneTransazione;
  35. import org.openspcoop2.monitor.engine.config.transazioni.ConfigurazioneTransazionePlugin;
  36. import org.openspcoop2.monitor.engine.config.transazioni.ConfigurazioneTransazioneRisorsaContenuto;
  37. import org.openspcoop2.monitor.engine.config.transazioni.ConfigurazioneTransazioneStato;
  38. import org.openspcoop2.monitor.engine.config.transazioni.constants.PosizioneMascheramento;
  39. import org.openspcoop2.monitor.engine.config.transazioni.constants.TipoControllo;
  40. import org.openspcoop2.monitor.engine.config.transazioni.constants.TipoMascheramento;
  41. import org.openspcoop2.monitor.engine.dynamic.DynamicFactory;
  42. import org.openspcoop2.monitor.engine.dynamic.IDynamicLoader;
  43. import org.openspcoop2.monitor.engine.transaction.TransactionContentUtils;
  44. import org.openspcoop2.monitor.engine.transaction.TransactionManager;
  45. import org.openspcoop2.monitor.sdk.plugins.ITransactionProcessing;
  46. import org.openspcoop2.monitor.sdk.transaction.Transaction;
  47. import org.openspcoop2.protocol.sdk.diagnostica.MsgDiagnostico;
  48. import org.openspcoop2.protocol.sdk.tracciamento.Traccia;
  49. import org.openspcoop2.protocol.sdk.tracciamento.TracciamentoException;
  50. import org.openspcoop2.utils.regexp.RegularExpressionEngine;
  51. import org.openspcoop2.utils.xml.AbstractXPathExpressionEngine;
  52. import org.openspcoop2.utils.xml.DynamicNamespaceContext;
  53. import org.openspcoop2.utils.xml.XPathException;
  54. import org.openspcoop2.utils.xml.XPathNotFoundException;
  55. import org.openspcoop2.utils.xml.XPathNotValidException;
  56. import org.openspcoop2.utils.xml.XPathReturnType;
  57. import org.slf4j.Logger;
  58. import org.w3c.dom.NodeList;

  59. /**
  60.  * TransactionServiceLibrary
  61.  *
  62.  * @author Poli Andrea (apoli@link.it)
  63.  * @author $Author$
  64.  * @version $Rev$, $Date$
  65.  */
  66. public class TransactionServiceLibrary implements Serializable {

  67.     /**
  68.      *
  69.      */
  70.     private static final long serialVersionUID = 1L;

  71.     private BasicServiceLibrary basicServiceLibrary;
  72.     private ConfigurazioneTransazione transactionActionLibrary;
  73.     private ConfigurazioneTransazione transactionActionAllLibrary;

  74.     public BasicServiceLibrary getBasicServiceLibrary() {
  75.         return this.basicServiceLibrary;
  76.     }
  77.     public void setBasicServiceLibrary(BasicServiceLibrary basicServiceLibrary) {
  78.         this.basicServiceLibrary = basicServiceLibrary;
  79.     }
  80.     public ConfigurazioneTransazione getTransactionActionLibrary() {
  81.         return this.transactionActionLibrary;
  82.     }
  83.     public void setTransactionActionLibrary(
  84.             ConfigurazioneTransazione transactionActionLibrary) {
  85.         this.transactionActionLibrary = transactionActionLibrary;
  86.     }
  87.     public ConfigurazioneTransazione getTransactionActionAllLibrary() {
  88.         return this.transactionActionAllLibrary;
  89.     }
  90.     public void setTransactionActionAllLibrary(
  91.             ConfigurazioneTransazione transactionActionAllLibrary) {
  92.         this.transactionActionAllLibrary = transactionActionAllLibrary;
  93.     }





  94.     // ****** STATI E RISORSE ***************

  95.     public TransactionInfo readStatoAndResources(OpenSPCoop2Message msg, MessageDynamicNamespaceContextFactory dncFactory,
  96.             AbstractXPathExpressionEngine xpathEngine, boolean debug, Logger log, boolean isRichiesta,
  97.             String idTransazione) throws Exception{
  98.         TransactionInfo transactionInfo = new TransactionInfo();
  99.         this._readStatoAndResources(null, msg, dncFactory, xpathEngine, debug, log, isRichiesta, idTransazione, true, true,
  100.                 transactionInfo);
  101.         return transactionInfo;
  102.     }
  103.     public TransactionInfo readStato(OpenSPCoop2Message msg, MessageDynamicNamespaceContextFactory dncFactory,
  104.             AbstractXPathExpressionEngine xpathEngine, boolean debug, Logger log, boolean isRichiesta,
  105.             String idTransazione) throws Exception{
  106.         TransactionInfo transactionInfo = new TransactionInfo();
  107.         this._readStatoAndResources(null,  msg, dncFactory, xpathEngine, debug, log, isRichiesta, idTransazione, true, false,
  108.                 transactionInfo);
  109.         return transactionInfo;
  110.     }
  111.     public TransactionInfo readResources(OpenSPCoop2Message msg, MessageDynamicNamespaceContextFactory dncFactory,
  112.             AbstractXPathExpressionEngine xpathEngine, boolean debug, Logger log, boolean isRichiesta,
  113.             String idTransazione, String stato) throws Exception{
  114.         TransactionInfo transactionInfo = new TransactionInfo();
  115.         transactionInfo.setStato(stato);
  116.         this._readStatoAndResources(null,  msg, dncFactory, xpathEngine, debug, log, isRichiesta, idTransazione, false, true,
  117.                 transactionInfo);
  118.         return transactionInfo;
  119.     }
  120.     private void _readStatoAndResources(SOAPEnvelope soapEnvelope,OpenSPCoop2Message msg,
  121.             MessageDynamicNamespaceContextFactory dncFactory,
  122.             AbstractXPathExpressionEngine xpathEngine, boolean debug, Logger log, boolean isRichiesta,
  123.             String idTransazione, boolean readStato, boolean readResources,
  124.             TransactionInfo transactionInfo) throws Exception{
  125.         // Ottengo SOAPEnvelope
  126.         DynamicNamespaceContext dnc = null;

  127.         if(readStato){
  128.             // ** Esamino gli stati della transazione se la transazione attuale non ha gia assegnato uno stato **
  129.             if(transactionInfo.getStato()==null){
  130.                 // Provo prima ad utilizzare lo stato definito in una azione specifica
  131.                 if(this.getTransactionActionLibrary()!=null){
  132.                     if(this.getTransactionActionLibrary().sizeConfigurazioneTransazioneStatoList()>0){
  133.                         if(soapEnvelope==null){
  134.                             soapEnvelope = msg.castAsSoap().getSOAPPart().getEnvelope();
  135.                         }
  136.                         if(dnc==null){
  137.                             if(MessageType.SOAP_11.equals(msg.getMessageType())){
  138.                                 dnc = dncFactory.getNamespaceContextFromSoapEnvelope11(soapEnvelope);
  139.                             }
  140.                             else{
  141.                                 dnc = dncFactory.getNamespaceContextFromSoapEnvelope12(soapEnvelope);
  142.                             }
  143.                         }
  144.                     }
  145.                     this.updateTransactionState(this.getTransactionActionLibrary().getConfigurazioneTransazioneStatoList(),
  146.                             isRichiesta, soapEnvelope, msg, dnc,
  147.                             idTransazione, xpathEngine, debug, log, transactionInfo);
  148.                 }
  149.                 // Provo poi ad utilizzare gli stati associati all'azione '*'
  150.                 if(transactionInfo.getStato()==null){
  151.                     if(this.getTransactionActionAllLibrary()!=null){
  152.                         if(this.getTransactionActionAllLibrary().sizeConfigurazioneTransazioneStatoList()>0){
  153.                             if(soapEnvelope==null){
  154.                                 soapEnvelope = msg.castAsSoap().getSOAPPart().getEnvelope();
  155.                             }
  156.                             if(dnc==null){
  157.                                 if(MessageType.SOAP_11.equals(msg.getMessageType())){
  158.                                     dnc = dncFactory.getNamespaceContextFromSoapEnvelope11(soapEnvelope);
  159.                                 }
  160.                                 else{
  161.                                     dnc = dncFactory.getNamespaceContextFromSoapEnvelope12(soapEnvelope);
  162.                                 }
  163.                             }
  164.                         }
  165.                         updateTransactionState(this.getTransactionActionAllLibrary().getConfigurazioneTransazioneStatoList(),
  166.                                 isRichiesta, soapEnvelope, msg, dnc,
  167.                                 idTransazione, xpathEngine, debug, log, transactionInfo);
  168.                     }
  169.                 }
  170.             }
  171.         }
  172.        
  173.        
  174.         if(readResources){

  175.             // elaboro risorse
  176.             List<ConfigurazioneTransazioneRisorsaContenuto> risorse = this.mergeServiceActionTransactionLibrary_resources();
  177.    
  178.             // XPATH
  179.             Map<String, String> notFoundRules = new HashMap<>();
  180.             Map<String, String> dirtyRules = new HashMap<>();
  181.             if(risorse.size()>0){
  182.    
  183.                 if(soapEnvelope==null){
  184.                     soapEnvelope = msg.castAsSoap().getSOAPPart().getEnvelope();
  185.                 }
  186.                 if(dnc==null){
  187.                     if(MessageType.SOAP_11.equals(msg.getMessageType())){
  188.                         dnc = dncFactory.getNamespaceContextFromSoapEnvelope11(soapEnvelope);
  189.                     }
  190.                     else{
  191.                         dnc = dncFactory.getNamespaceContextFromSoapEnvelope12(soapEnvelope);
  192.                     }
  193.                 }
  194.                 // NOTA!!!! I Fault devono essere analizzati, puo' darsi che gli stati o le risorse (errore) le debba estrarre da un SoapFault.
  195.                 //if(dnc.isSoapFault()){
  196.                 //  return; // non devo analizzare i soap fault.
  197.                 //}
  198.    
  199.                 List<TransactionResource> contenuti = this.recuperaContenuti(isRichiesta, transactionInfo.getStato(), soapEnvelope, dnc, risorse, notFoundRules, dirtyRules,
  200.                         xpathEngine, debug, log);
  201.                 if(contenuti!=null){
  202.                     for (int i = 0; i < contenuti.size(); i++) {
  203.                         transactionInfo.getRisorse().add(contenuti.get(i));
  204.                     }
  205.                 }
  206.    
  207.             }
  208.    
  209.             //controllo se ci sono regole non trovate e/o "sporche"
  210.    
  211.             if(debug){
  212.                 StringBuilder sbNotFound = new StringBuilder();
  213.                 if(notFoundRules.size()>0){
  214.                     sbNotFound.append("Regole non trovate:");
  215.                     for (String k : notFoundRules.keySet()) {
  216.                         sbNotFound.append("\n["+(k)+"]");
  217.                     }
  218.                 }
  219.                 log.debug(sbNotFound.toString());
  220.             }
  221.    
  222.             StringBuilder sb = new StringBuilder();
  223.             if(dirtyRules.size()>0){
  224.                 sb.append("\nRegole non valide:");
  225.                 for (String k : dirtyRules.keySet()) {
  226.                     String val = "\n["+k+"-"+(dirtyRules.get(k))+"]";
  227.                     sb.append(val);
  228.    
  229.                 }
  230.             }
  231.    
  232.             if(sb.length()>0){
  233.                 throw new TracciamentoException(sb.toString());
  234.             }          
  235.         }
  236.     }

  237.     private void updateTransactionState(List<ConfigurazioneTransazioneStato> transactionStates,boolean richiesta,
  238.             SOAPEnvelope soapEnvelope,OpenSPCoop2Message msg,DynamicNamespaceContext dnc,String idTransazione,
  239.             AbstractXPathExpressionEngine xpathEngine, boolean debug, Logger log,
  240.             TransactionInfo transactionInfo) throws Exception{
  241.         for (int i = 0; i < transactionStates.size(); i++) {
  242.             ConfigurazioneTransazioneStato stato = transactionStates.get(i);
  243.            
  244.             if(stato.isEnabled()==false){
  245.                 continue;
  246.             }
  247.            
  248.             // controllo su richiesta/risposta
  249.             boolean matchTipoMessaggio = false;
  250.             if(richiesta){
  251.                 matchTipoMessaggio = org.openspcoop2.monitor.engine.config.transazioni.constants.TipoMessaggio.RICHIESTA.equals(stato.getTipoMessaggio());
  252.             }else{
  253.                 matchTipoMessaggio = org.openspcoop2.monitor.engine.config.transazioni.constants.TipoMessaggio.RISPOSTA.equals(stato.getTipoMessaggio());
  254.             }
  255.             if(!matchTipoMessaggio){
  256.                 continue;
  257.             }
  258.        
  259.             // NOTA!!!! I Fault devono essere analizzati, puo' darsi che gli stati o le risorse (errore) le debba estrarre da un SoapFault.
  260.             //if(dnc.isSoapFault()){
  261.             //  return; // non devo analizzare i soap fault.
  262.             //}
  263.            
  264.             if(TipoControllo.EXIST.equals(stato.getTipoControllo())){
  265.                 Object oString = null;
  266.                 try{
  267.                     oString = xpathEngine.getMatchPattern(soapEnvelope, dnc, stato.getXpath(), XPathReturnType.STRING);
  268.                 }catch (XPathNotFoundException nfe) {
  269.                     if(debug)
  270.                         log.debug("Stato ["+stato.getNome()+"] con tipoControllo["+stato.getTipoControllo()+"] (xpath:"+stato.getXpath()+") non riscontrato per la trasazione ["+idTransazione+"]: "+nfe.getMessage());
  271.                 }
  272.                 if(oString!=null){
  273.                     if(debug)
  274.                         log.info("Trovato stato ["+stato.getNome()+"] con tipoControllo["+stato.getTipoControllo()+"] (xpath:"+stato.getXpath()+") per la trasazione ["+idTransazione+"]");
  275.                     transactionInfo.setStato(stato.getNome());
  276.                     break;
  277.                 }
  278.             }
  279.             else{
  280.                 String oString = null;
  281.                 try{
  282.                     oString = (String) xpathEngine.getMatchPattern(soapEnvelope, dnc, stato.getXpath(), XPathReturnType.STRING);
  283.                 }catch (XPathNotFoundException nfe) {
  284.                     if(debug)
  285.                         log.debug("Stato ["+stato.getNome()+"] con tipoControllo["+stato.getTipoControllo()+"] (xpath:"+stato.getXpath()+") non riscontrato per la trasazione ["+idTransazione+"]: "+nfe.getMessage());
  286.                 }
  287.                 if(oString!=null){
  288.                     if(TipoControllo.EQUALS.equals(stato.getTipoControllo())){
  289.                         if(oString.equals(stato.getValore())){
  290.                             if(debug)
  291.                                 log.info("Trovato stato ["+stato.getNome()+"] per trasazione ["+idTransazione+"]");
  292.                             transactionInfo.setStato(stato.getNome());
  293.                             break;
  294.                         }
  295.                     }else if(TipoControllo.MATCH.equals(stato.getTipoControllo())){
  296.                         if(RegularExpressionEngine.isMatch(oString, stato.getValore())){
  297.                             if(debug)
  298.                                 log.info("Trovato stato ["+stato.getNome()+"] con tipoControllo["+stato.getTipoControllo()+"] (xpath:"+stato.getXpath()+") per la trasazione ["+idTransazione+"]");
  299.                             transactionInfo.setStato(stato.getNome());
  300.                             break;
  301.                         }
  302.                     }
  303.                 }      
  304.             }
  305.         }
  306.     }
  307.    
  308.     private List<TransactionResource> recuperaContenuti(boolean richiesta,String stato,SOAPEnvelope soapEnvelope,DynamicNamespaceContext dnc,
  309.             List<ConfigurazioneTransazioneRisorsaContenuto> risorse, Map<String, String> rulesNotFuond, Map<String, String> dirtyRules,
  310.             AbstractXPathExpressionEngine xpathEngine, boolean debug, Logger log) throws Exception {
  311.        
  312.         List<TransactionResource> res = new ArrayList<TransactionResource>();
  313.        
  314.         if(dnc.isSoapBodyEmpty()){
  315.             return res;
  316.         }
  317.        
  318.         for (int i = 0; i < risorse.size(); i++) {
  319.            
  320.             ConfigurazioneTransazioneRisorsaContenuto risorsa = risorse.get(i);
  321.            
  322.             // check tipo messaggio
  323.             boolean matchTipoMessaggio = false;
  324.             if(richiesta){
  325.                 matchTipoMessaggio = org.openspcoop2.monitor.engine.config.transazioni.constants.TipoMessaggio.RICHIESTA.equals(risorsa.getTipoMessaggio());
  326.             }else{
  327.                 matchTipoMessaggio = org.openspcoop2.monitor.engine.config.transazioni.constants.TipoMessaggio.RISPOSTA.equals(risorsa.getTipoMessaggio());
  328.             }
  329.             if(!matchTipoMessaggio){
  330.                 continue;  // messaggio non compatibile con lo stato
  331.             }
  332.            
  333.             // check stato
  334.             if(stato!=null){
  335.                 if(risorsa.getIdConfigurazioneTransazioneStato()!=null){
  336.                     String statoRichiestoDallaRisorsa = risorsa.getIdConfigurazioneTransazioneStato().getStato();
  337.                     if(statoRichiestoDallaRisorsa!=null && !"*".equals(statoRichiestoDallaRisorsa)){
  338.                         // check che la risorsa in questione sia compatibili con lo stato che sto esaminando
  339.                         if(!stato.equals(statoRichiestoDallaRisorsa)){
  340.                             continue; // risorsa non compatibile con lo stato
  341.                         }
  342.                     }  
  343.                 }
  344.             }
  345.             else{
  346.                 // lo stato associato alla transazione è null.
  347.                 // se nella risorsa è richiesto uno stato specifico non devo proseguire
  348.                 if(risorsa.getIdConfigurazioneTransazioneStato()!=null){
  349.                     String statoRichiestoDallaRisorsa = risorsa.getIdConfigurazioneTransazioneStato().getStato();
  350.                     if(statoRichiestoDallaRisorsa!=null && !"*".equals(statoRichiestoDallaRisorsa)){
  351.                         continue; // risorsa non compatibile con lo stato
  352.                     }  
  353.                 }
  354.             }
  355.            
  356.             String nomeProprieta = risorsa.getNome();
  357.             String percorsoProprieta = risorsa.getXpath();
  358.             try{
  359.                 // NOTA!!!! I Fault devono essere analizzati, puo' darsi che gli stati o le risorse (errore) le debba estrarre da un SoapFault.
  360.                 //if(dnc.isSoapFault()){
  361.                 //  non e' possibile raccogliere proprieta' se abbiamo un soap fault
  362.                 //  continue;
  363.                 //}
  364.                
  365.                 // Provo a cercarlo prima come Node
  366.                 NodeList nodeList = null;
  367.                 Exception exceptionNodeSet = null;
  368.                 String risultato = null;
  369.                 try{
  370.                     nodeList = (NodeList) xpathEngine.getMatchPattern(soapEnvelope, dnc, percorsoProprieta,XPathReturnType.NODESET);
  371.                     if(nodeList!=null){
  372.                         risultato = xpathEngine.toString(nodeList);
  373.                     }
  374.                 }catch(Exception e){
  375.                     exceptionNodeSet = e;
  376.                 }
  377.                
  378.                 // Se non l'ho trovato provo a cercarlo come string (es. il metodo sopra serve per avere l'xml, ma fallisce in caso di concat, in caso di errori di concat_openspcoop....)
  379.                 // Insomma il caso dell'xml sopra e' quello speciale, che pero' deve essere eseguito prima, perche' altrimenti il caso string sotto funziona sempre, e quindi non si ottiene mai l'xml.
  380.                 if(risultato==null || "".equals(risultato)){
  381.                     try{
  382.                         risultato = xpathEngine.getStringMatchPattern(soapEnvelope, dnc, percorsoProprieta);
  383.                     }catch(Exception e){
  384.                         if(exceptionNodeSet!=null){
  385.                             log.error("Errore avvenuto durante la getStringMatchPattern("+percorsoProprieta
  386.                                     +") ("+e.getMessage()+") invocata in seguito all'errore dell'invocazione getMatchPattern("+
  387.                                     percorsoProprieta+",NODESET): "+exceptionNodeSet.getMessage(),exceptionNodeSet);
  388.                         }
  389.                         // lancio questo errore.
  390.                         if(e instanceof XPathNotFoundException){
  391.                             throw (XPathNotFoundException) e;
  392.                         }else if(e instanceof XPathNotValidException){
  393.                             throw (XPathNotValidException) e;
  394.                         }else if(e instanceof XPathException){
  395.                             throw (XPathException) e;
  396.                         }else{
  397.                             throw e;
  398.                         }
  399.                     }
  400.                 }
  401.                
  402.                 if(risultato == null || "".equals(risultato)){
  403.                     if(exceptionNodeSet!=null){
  404.                         log.error("Non sono stati trovati risultati tramite l'invocazione del metodo getStringMatchPattern("+percorsoProprieta
  405.                                 +") invocato in seguito all'errore dell'invocazione getMatchPattern("+
  406.                                 percorsoProprieta+",NODESET): "+exceptionNodeSet.getMessage(),exceptionNodeSet);
  407.                     }
  408.                     rulesNotFuond.put(nomeProprieta,percorsoProprieta);
  409.                 }else{
  410.                     // TROVATO DA AGGIUNGERE AL DATABASE!
  411.                     //res.put(nomeProprieta+" - "+ percorsoProprieta, risultato);
  412.                     TransactionResource risorsaCalcolata = new TransactionResource();
  413.                     if(richiesta)
  414.                         risorsaCalcolata.setTipoMessaggio(org.openspcoop2.core.transazioni.constants.TipoMessaggio.RICHIESTA_INGRESSO);
  415.                     else
  416.                         risorsaCalcolata.setTipoMessaggio(org.openspcoop2.core.transazioni.constants.TipoMessaggio.RISPOSTA_INGRESSO);
  417.                     risorsaCalcolata.setNome(nomeProprieta);
  418.                     risorsaCalcolata.setValore(risultato);
  419.                     res.add(risorsaCalcolata);
  420.                     if(debug){
  421.                         log.debug(nomeProprieta+" - "+ percorsoProprieta +" : "+risultato);
  422.                     }
  423.                 }
  424.                
  425.             }catch (XPathNotFoundException nfe) {
  426.                 // not found rule
  427.                 rulesNotFuond.put(nomeProprieta,nfe.getMessage());
  428.             }catch (XPathNotValidException re) {
  429.                 // dirty rule
  430.                 log.error("Errore di validazione della query XPath ["+percorsoProprieta+"] durante la valutazione della proprieta ["+nomeProprieta+"]: "+re.getMessage(),re);
  431.                 dirtyRules.put(nomeProprieta,re.getMessage());
  432.             }catch (XPathException re) {
  433.                 // dirty rule
  434.                 log.error("Errore durante la valutazione della proprieta ["+nomeProprieta+"] query XPath ["+percorsoProprieta+"]: "+re.getMessage(),re);
  435.                 dirtyRules.put(nomeProprieta,re.getMessage());
  436.             }catch(Exception e){
  437.                 throw new Exception("Errore generico durante la valutazione della proprieta ["+nomeProprieta+"] query XPath ["+percorsoProprieta+"]: "+e.getMessage(),e);
  438.             }
  439.         }
  440.        
  441.         return res;
  442.     }
  443.    
  444.    
  445.    


  446.     // ****** SDK BEFORE SAVE ON DATABASE***************

  447.     public boolean processResourcesBeforeSaveOnDatabase(Transazione transazione,
  448.             Traccia tracciaRichiesta, Traccia tracciaRisposta,
  449.             List<MsgDiagnostico> msgDiagnostici,
  450.             DumpMessaggio dumpMessaggioRichiestaIngresso, DumpMessaggio dumpMessaggioRichiestaUscita,
  451.             DumpMessaggio dumpMessaggioRispostaIngresso, DumpMessaggio dumpMessaggioRispostaUscita,
  452.             String stato,
  453.             Logger log, DAOFactory daoFactory) throws Exception{
  454.         return this.processResourcesBeforeSaveOnDatabase(transazione,
  455.                 tracciaRichiesta,tracciaRisposta,
  456.                 msgDiagnostici,
  457.                 dumpMessaggioRichiestaIngresso, dumpMessaggioRichiestaUscita,
  458.                 dumpMessaggioRispostaIngresso, dumpMessaggioRispostaUscita,
  459.                 stato,
  460.                 this.mergeServiceActionTransactionLibrary_resources(),
  461.                 this.mergeServiceActionTransactionLibrary_sdkPlugins(log),
  462.                 log,daoFactory);
  463.     }
  464.     public boolean processResourcesBeforeSaveOnDatabase(
  465.             Transazione transazione,Traccia tracciaRichiesta, Traccia tracciaRisposta,
  466.             List<MsgDiagnostico> msgDiagnostici,
  467.             DumpMessaggio dumpMessaggioRichiestaIngresso, DumpMessaggio dumpMessaggioRichiestaUscita,
  468.             DumpMessaggio dumpMessaggioRispostaIngresso, DumpMessaggio dumpMessaggioRispostaUscita,
  469.             String stato,
  470.             List<ConfigurazioneTransazioneRisorsaContenuto> listRisorseContenuto,
  471.             List<ITransactionProcessing> listTransactionProcessing,
  472.             Logger log, DAOFactory daoFactory) throws Exception{

  473.         boolean updated = this.updateDumpMessaggio(dumpMessaggioRichiestaIngresso, listRisorseContenuto, stato) &&
  474.                 this.updateDumpMessaggio(dumpMessaggioRichiestaUscita, listRisorseContenuto, stato) &&
  475.                 this.updateDumpMessaggio(dumpMessaggioRispostaIngresso, listRisorseContenuto, stato) &&
  476.                 this.updateDumpMessaggio(dumpMessaggioRispostaUscita, listRisorseContenuto, stato);


  477.         // SDK
  478.         if(listTransactionProcessing!=null && listTransactionProcessing.size()>0){

  479.             Transaction transactionSDK = new Transaction(log,daoFactory,transazione,
  480.                     tracciaRichiesta, tracciaRisposta,
  481.                     msgDiagnostici);
  482.             if(dumpMessaggioRichiestaIngresso!=null){
  483.                 TransactionManager.setContentResourcesInTransaction(transactionSDK, dumpMessaggioRichiestaIngresso);
  484.             }
  485.             if(dumpMessaggioRichiestaUscita!=null){
  486.                 TransactionManager.setContentResourcesInTransaction(transactionSDK, dumpMessaggioRichiestaUscita);
  487.             }
  488.             if(dumpMessaggioRispostaIngresso!=null){
  489.                 TransactionManager.setContentResourcesInTransaction(transactionSDK, dumpMessaggioRispostaIngresso);
  490.             }
  491.             if(dumpMessaggioRispostaUscita!=null){
  492.                 TransactionManager.setContentResourcesInTransaction(transactionSDK, dumpMessaggioRispostaUscita);
  493.             }

  494.             for (ITransactionProcessing iTransactionProcessing : listTransactionProcessing) {
  495.                 iTransactionProcessing.processRealTimeResourcesBeforeSaveOnDatabase(transactionSDK);
  496.             }

  497.             if(dumpMessaggioRichiestaIngresso!=null){
  498.                 if (TransactionManager.updateResources(dumpMessaggioRichiestaIngresso, transactionSDK)){
  499.                     updated = true;
  500.                 }
  501.             }
  502.             if(dumpMessaggioRichiestaUscita!=null){
  503.                 if (TransactionManager.updateResources(dumpMessaggioRichiestaUscita, transactionSDK)){
  504.                     updated = true;
  505.                 }
  506.             }
  507.             if(dumpMessaggioRispostaIngresso!=null){
  508.                 if (TransactionManager.updateResources(dumpMessaggioRispostaIngresso, transactionSDK)){
  509.                     updated = true;
  510.                 }
  511.             }
  512.             if(dumpMessaggioRispostaUscita!=null){
  513.                 if (TransactionManager.updateResources(dumpMessaggioRispostaUscita, transactionSDK)){
  514.                     updated = true;
  515.                 }
  516.             }
  517.         }

  518.         return updated;
  519.     }

  520.     private boolean updateDumpMessaggio(DumpMessaggio dumpMessaggio, List<ConfigurazioneTransazioneRisorsaContenuto> listRisorseContenuto, String stato) throws Exception{

  521.         boolean updated = false;

  522.         if(dumpMessaggio!=null){

  523.             // Risorse contenuto (configurate via govwayMonitor)
  524.             if(dumpMessaggio.sizeContenutoList()>0){
  525.                 for (DumpContenuto dumpContenuto : dumpMessaggio.getContenutoList()) {

  526.                     for (ConfigurazioneTransazioneRisorsaContenuto configurazioneTransazioneRisorsaContenuto : listRisorseContenuto) {

  527.                         if(configurazioneTransazioneRisorsaContenuto.getIdConfigurazioneTransazioneStato()!=null &&
  528.                                 configurazioneTransazioneRisorsaContenuto.getIdConfigurazioneTransazioneStato().getStato()!=null &&
  529.                                 !"".equals(configurazioneTransazioneRisorsaContenuto.getIdConfigurazioneTransazioneStato().getStato())){
  530.                             if(!configurazioneTransazioneRisorsaContenuto.getIdConfigurazioneTransazioneStato().getStato().equals(stato)){
  531.                                 continue;
  532.                             }
  533.                         }

  534.                         if(configurazioneTransazioneRisorsaContenuto.getTipoMessaggio().toString().equals(dumpMessaggio.getTipoMessaggio().toString()) &&
  535.                                 configurazioneTransazioneRisorsaContenuto.getNome().equals(dumpContenuto.getNome())){

  536.                             // mascheramento
  537.                             if(configurazioneTransazioneRisorsaContenuto.getAbilitaAnonimizzazione()!=null &&
  538.                                     configurazioneTransazioneRisorsaContenuto.getAbilitaAnonimizzazione() == 1){

  539.                                 if(TipoMascheramento.FISICO.equals(configurazioneTransazioneRisorsaContenuto.getTipoMascheramento())){
  540.                                     TransactionContentUtils.setDumpContenutoValue(dumpContenuto,
  541.                                             this.mascheramento(configurazioneTransazioneRisorsaContenuto.getCarattereMaschera(),
  542.                                                     configurazioneTransazioneRisorsaContenuto.getPosizionamentoMaschera(),
  543.                                                     configurazioneTransazioneRisorsaContenuto.getNumeroCaratteriMaschera(),
  544.                                                     TransactionContentUtils.getDumpContenutoValue(dumpContenuto)));
  545.                                     updated = true;
  546.                                 }

  547.                             }

  548.                             // compressione
  549.                             if(configurazioneTransazioneRisorsaContenuto.getAbilitaCompressione()!=null &&
  550.                                     configurazioneTransazioneRisorsaContenuto.getAbilitaCompressione() == 1){
  551.                                 TransactionContentUtils.compress(dumpContenuto, configurazioneTransazioneRisorsaContenuto.getTipoCompressione());
  552.                                 updated = true;
  553.                             }

  554.                             break;
  555.                         }
  556.                     }

  557.                 }
  558.             }
  559.         }

  560.         return updated;
  561.     }


  562.    







  563.     // ****** SDK AFTER READ FROM DATABASE***************

  564.     public boolean processResourcesAfterReadFromDatabase(Transazione transazione,DumpMessaggio dumpMessaggio,String stato,
  565.             Logger log, DAOFactory daoFactory) throws Exception{
  566.         return this.processResourcesAfterReadFromDatabase(transazione,dumpMessaggio, stato,
  567.                 this.mergeServiceActionTransactionLibrary_resources(),
  568.                 this.mergeServiceActionTransactionLibrary_sdkPlugins(log),
  569.                 log,daoFactory);
  570.     }
  571.     public boolean processResourcesAfterReadFromDatabase(Transazione transazione,DumpMessaggio dumpMessaggio,String stato,
  572.             List<ConfigurazioneTransazioneRisorsaContenuto> list,
  573.             List<ITransactionProcessing> listTransactionProcessing,
  574.             Logger log, DAOFactory daoFactory) throws Exception{


  575.         boolean updated = false;

  576.         if(dumpMessaggio!=null){

  577.             // Risorse contenuto (configurate via govwayMonitor)
  578.             if(dumpMessaggio.sizeContenutoList()>0){
  579.                 for (DumpContenuto dumpContenuto : dumpMessaggio.getContenutoList()) {

  580.                     for (ConfigurazioneTransazioneRisorsaContenuto configurazioneTransazioneRisorsaContenuto : list) {

  581.                         if(configurazioneTransazioneRisorsaContenuto.getIdConfigurazioneTransazioneStato()!=null &&
  582.                                 configurazioneTransazioneRisorsaContenuto.getIdConfigurazioneTransazioneStato().getStato()!=null &&
  583.                                 !"".equals(configurazioneTransazioneRisorsaContenuto.getIdConfigurazioneTransazioneStato().getStato())){
  584.                             if(!configurazioneTransazioneRisorsaContenuto.getIdConfigurazioneTransazioneStato().getStato().equals(stato)){
  585.                                 continue;
  586.                             }
  587.                         }

  588.                         if(configurazioneTransazioneRisorsaContenuto.getTipoMessaggio().toString().equals(dumpMessaggio.getTipoMessaggio().toString()) &&
  589.                                 configurazioneTransazioneRisorsaContenuto.getNome().equals(dumpContenuto.getNome())){

  590.                             // de-compressione
  591.                             if(configurazioneTransazioneRisorsaContenuto.getAbilitaCompressione()!=null &&
  592.                                     configurazioneTransazioneRisorsaContenuto.getAbilitaCompressione() == 1){
  593.                                 TransactionContentUtils.decompress(dumpContenuto, configurazioneTransazioneRisorsaContenuto.getTipoCompressione());
  594.                                 updated = true;
  595.                             }

  596.                             // de-mascheramento
  597.                             if(configurazioneTransazioneRisorsaContenuto.getAbilitaAnonimizzazione()!=null &&
  598.                                     configurazioneTransazioneRisorsaContenuto.getAbilitaAnonimizzazione() == 1){
  599.                                 if(TipoMascheramento.LOGICO.equals(configurazioneTransazioneRisorsaContenuto.getTipoMascheramento())){
  600.                                     TransactionContentUtils.setDumpContenutoValue(dumpContenuto,
  601.                                             this.mascheramento(configurazioneTransazioneRisorsaContenuto.getCarattereMaschera(),
  602.                                             configurazioneTransazioneRisorsaContenuto.getPosizionamentoMaschera(),
  603.                                             configurazioneTransazioneRisorsaContenuto.getNumeroCaratteriMaschera(),
  604.                                             TransactionContentUtils.getDumpContenutoValue(dumpContenuto)));
  605.                                     updated = true;
  606.                                 }
  607.                             }

  608.                             break;
  609.                         }
  610.                     }

  611.                 }
  612.             }

  613.             // SDK
  614.             if(listTransactionProcessing!=null && listTransactionProcessing.size()>0){

  615.                 Transaction transactionSDK = new Transaction(log,daoFactory,transazione);
  616.                 TransactionManager.setContentResourcesInTransaction(transactionSDK, dumpMessaggio);

  617.                 for (ITransactionProcessing iTransactionProcessing : listTransactionProcessing) {
  618.                     iTransactionProcessing.processRealTimeResourcesAfterReadFromDatabase(transactionSDK);
  619.                 }

  620.                 if (TransactionManager.updateResources(dumpMessaggio, transactionSDK)){
  621.                     updated = true;
  622.                 }

  623.             }
  624.         }

  625.         return updated;

  626.     }






  627.     // ****** UTILS ***************

  628.     @Override
  629.     public String toString(){
  630.         StringBuilder bf = new StringBuilder();

  631.         if(this.basicServiceLibrary==null){
  632.             bf.append("BasicServiceLibrary: notDefined");
  633.             bf.append("\n");
  634.         }
  635.         else{
  636.             bf.append(this.basicServiceLibrary.toString());
  637.         }

  638.         bf.append("TransactionActionLibrary: ");
  639.         if(this.getTransactionActionLibrary()!=null){
  640.             bf.append("presente size-plugins[").
  641.             append(this.getTransactionActionLibrary().sizeConfigurazioneTransazionePluginList()).
  642.             append("] plugins[").
  643.             append(this.getTransactionActionLibrary().getConfigurazioneTransazionePluginList()).
  644.             append(" size-stati[").
  645.             append(this.getTransactionActionLibrary().sizeConfigurazioneTransazioneStatoList()).
  646.             append("] stati[").
  647.             append(this.getTransactionActionLibrary().getConfigurazioneTransazioneStatoList()).
  648.             append("] size-risorse[").
  649.             append(this.getTransactionActionLibrary().sizeConfigurazioneTransazioneRisorsaContenutoList()).
  650.             append("] risorse[").
  651.             append(this.getTransactionActionLibrary().getConfigurazioneTransazioneRisorsaContenutoList()).
  652.             append("] enabled[").
  653.             append(this.getTransactionActionLibrary().isEnabled()).
  654.             append("]");
  655.         }else{
  656.             bf.append("-");
  657.         }
  658.         bf.append("\n");

  659.         bf.append("TransactionActionAllLibrary: ");
  660.         if(this.getTransactionActionAllLibrary()!=null){
  661.             bf.append("presente size-plugins[").
  662.             append(this.getTransactionActionAllLibrary().sizeConfigurazioneTransazionePluginList()).
  663.             append("] plugins[").
  664.             append(this.getTransactionActionAllLibrary().getConfigurazioneTransazionePluginList()).
  665.             append("presente size-stati[").
  666.             append(this.getTransactionActionAllLibrary().sizeConfigurazioneTransazioneStatoList()).
  667.             append("] stati[").
  668.             append(this.getTransactionActionAllLibrary().getConfigurazioneTransazioneStatoList()).
  669.             append("] size-risorse[").
  670.             append(this.getTransactionActionAllLibrary().sizeConfigurazioneTransazioneRisorsaContenutoList()).
  671.             append("] risorse[").
  672.             append(this.getTransactionActionAllLibrary().getConfigurazioneTransazioneRisorsaContenutoList()).
  673.             append("] enabled[").
  674.             append(this.getTransactionActionAllLibrary().isEnabled()).
  675.             append("]");
  676.         }else{
  677.             bf.append("-");
  678.         }
  679.         bf.append("\n");


  680.         return bf.toString();
  681.     }

  682.     public List<ConfigurazioneTransazioneStato> mergeServiceActionTransactionLibrary_states() throws Exception{

  683.         List<ConfigurazioneTransazioneStato> list = new ArrayList<ConfigurazioneTransazioneStato>();
  684.         List<String> idStati = new ArrayList<>();

  685.         // Leggo le risorse associate all'azione specifica
  686.         if(this.transactionActionLibrary!=null && this.transactionActionLibrary.sizeConfigurazioneTransazioneStatoList()>0){
  687.             for (ConfigurazioneTransazioneStato configurazioneTransazioneStato : this.transactionActionLibrary.getConfigurazioneTransazioneStatoList()) {
  688.                 if(configurazioneTransazioneStato.isEnabled()){
  689.                     list.add(configurazioneTransazioneStato);
  690.                     idStati.add(configurazioneTransazioneStato.getNome());
  691.                 }
  692.             }
  693.         }

  694.         // Leggo le risorse associate all'azione '*'
  695.         if(this.transactionActionAllLibrary!=null && this.transactionActionAllLibrary.sizeConfigurazioneTransazioneStatoList()>0){
  696.             for (ConfigurazioneTransazioneStato configurazioneTransazioneStato : this.transactionActionAllLibrary.getConfigurazioneTransazioneStatoList()) {
  697.                 if(configurazioneTransazioneStato.isEnabled()){
  698.                     String idStato = configurazioneTransazioneStato.getNome();
  699.                     if(idStati.contains(idStato)==false){
  700.    
  701.                         // inserisco solo gli stati il cui nome non siano gia stati utilizzati nell'azione specifica
  702.    
  703.                         list.add(configurazioneTransazioneStato);
  704.                         idStati.add(idStato);
  705.                     }
  706.                 }
  707.             }
  708.         }

  709.         return list;
  710.     }

  711.     public List<ConfigurazioneTransazioneRisorsaContenuto> mergeServiceActionTransactionLibrary_resources() throws Exception{

  712.         List<ConfigurazioneTransazioneRisorsaContenuto> list = new ArrayList<ConfigurazioneTransazioneRisorsaContenuto>();
  713.         List<String> idRisorse = new ArrayList<>();

  714.         // Leggo le risorse associate all'azione specifica
  715.         if(this.transactionActionLibrary!=null && this.transactionActionLibrary.sizeConfigurazioneTransazioneRisorsaContenutoList()>0){
  716.             for (ConfigurazioneTransazioneRisorsaContenuto configurazioneTransazioneRisorsaContenuto : this.transactionActionLibrary.getConfigurazioneTransazioneRisorsaContenutoList()) {
  717.                 if(configurazioneTransazioneRisorsaContenuto.isEnabled()){
  718.                     list.add(configurazioneTransazioneRisorsaContenuto);
  719.                     //idRisorse.add(configurazioneTransazioneRisorsaContenuto.getNome()+"_"+configurazioneTransazioneRisorsaContenuto.getTipoMessaggio().name());
  720.                     idRisorse.add(configurazioneTransazioneRisorsaContenuto.getNome()); // è stato definito lo unique sul nome
  721.                 }
  722.             }
  723.         }

  724.         // Leggo le risorse associate all'azione '*'
  725.         if(this.transactionActionAllLibrary!=null && this.transactionActionAllLibrary.sizeConfigurazioneTransazioneRisorsaContenutoList()>0){
  726.             for (ConfigurazioneTransazioneRisorsaContenuto configurazioneTransazioneRisorsaContenuto : this.transactionActionAllLibrary.getConfigurazioneTransazioneRisorsaContenutoList()) {
  727.                 if(configurazioneTransazioneRisorsaContenuto.isEnabled()){
  728.                     //String idRisorsa = configurazioneTransazioneRisorsaContenuto.getNome()+"_"+configurazioneTransazioneRisorsaContenuto.getTipoMessaggio().name();
  729.                     String idRisorsa = configurazioneTransazioneRisorsaContenuto.getNome(); // è stato definito lo unique sul nome
  730.                     if(idRisorse.contains(idRisorsa)==false){
  731.    
  732.                         // inserisco solo le risorse il cui nome e tipo non siano gia stati utilizzati nell'azione specifica
  733.    
  734.                         list.add(configurazioneTransazioneRisorsaContenuto);
  735.                         idRisorse.add(idRisorsa);
  736.                     }
  737.                 }
  738.             }
  739.         }

  740.         return list;
  741.     }

  742.     public List<ITransactionProcessing> mergeServiceActionTransactionLibrary_sdkPlugins(Logger log) throws Exception{

  743.         List<ITransactionProcessing> list = new ArrayList<ITransactionProcessing>();
  744.         List<String> idRisorse = new ArrayList<>();

  745.         // Leggo le risorse associate all'azione specifica
  746.         if(this.transactionActionLibrary!=null && this.transactionActionLibrary.getEnabled()
  747.                 && this.transactionActionLibrary.getConfigurazioneTransazionePluginList()!=null &&
  748.                         this.transactionActionLibrary.getConfigurazioneTransazionePluginList().size()>0){
  749.             for (ConfigurazioneTransazionePlugin configTransazionePlugin : this.transactionActionLibrary.getConfigurazioneTransazionePluginList()) {
  750.                 if(configTransazionePlugin.isEnabled()){
  751.                     String className = configTransazionePlugin.getPlugin().getClassName();
  752.                     if(idRisorse.contains(className)==false){
  753.                         IDynamicLoader loader = DynamicFactory.getInstance().newDynamicLoader(configTransazionePlugin.getPlugin().getTipoPlugin(), configTransazionePlugin.getPlugin().getTipo(),
  754.                                 className, log);
  755.                         ITransactionProcessing transactionProcessor = (ITransactionProcessing) loader.newInstance();
  756.                         idRisorse.add(className);
  757.                         list.add(transactionProcessor);
  758.                     }  
  759.                 }
  760.             }
  761.         }

  762.         // Leggo le risorse associate all'azione '*'
  763.         if(this.transactionActionAllLibrary!=null && this.transactionActionAllLibrary.getEnabled()
  764.                 && this.transactionActionAllLibrary.getConfigurazioneTransazionePluginList()!=null &&
  765.                         this.transactionActionAllLibrary.getConfigurazioneTransazionePluginList().size()>0){
  766.             for (ConfigurazioneTransazionePlugin configTransazionePlugin : this.transactionActionAllLibrary.getConfigurazioneTransazionePluginList()) {
  767.                 if(configTransazionePlugin.isEnabled()){
  768.                     String className = configTransazionePlugin.getPlugin().getClassName();
  769.                     if(idRisorse.contains(className)==false){
  770.                         IDynamicLoader loader = DynamicFactory.getInstance().newDynamicLoader(configTransazionePlugin.getPlugin().getTipoPlugin(), configTransazionePlugin.getPlugin().getTipo(),
  771.                                 className, log);
  772.                         ITransactionProcessing transactionProcessor = (ITransactionProcessing) loader.newInstance();
  773.                         idRisorse.add(className);
  774.                         list.add(transactionProcessor);
  775.                     }
  776.                 }
  777.             }
  778.         }

  779.         return list;
  780.     }

  781.     private String mascheramento(char carattereMascheramento, PosizioneMascheramento posizioneMascheramento, int numero, String originale){
  782.         StringBuilder bf = new StringBuilder();
  783.         if(originale.length()<=numero || numero<=0  ){
  784.             for (int i = 0; i < originale.length(); i++) {
  785.                 bf.append(carattereMascheramento);      
  786.             }
  787.         }
  788.         else{
  789.             if(PosizioneMascheramento.PRIMI.equals(posizioneMascheramento)){
  790.                 int i=0;
  791.                 for (; i < numero; i++) {
  792.                     bf.append(carattereMascheramento);      
  793.                 }
  794.                 for (; i < originale.length(); i++) {
  795.                     bf.append(originale.charAt(i));    
  796.                 }
  797.             }
  798.             else{
  799.                 int i=0;
  800.                 for (; i < (originale.length()-numero); i++) {
  801.                     bf.append(originale.charAt(i));    
  802.                 }
  803.                 for (; i < originale.length(); i++) {
  804.                     bf.append(carattereMascheramento);      
  805.                 }
  806.             }
  807.         }
  808.         return bf.toString();
  809.     }
  810. }