SDIValidatoreServizioRicezioneFatture.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.protocol.sdi.validator;

  21. import java.io.ByteArrayInputStream;
  22. import java.util.Iterator;
  23. import java.util.List;

  24. import javax.xml.namespace.QName;
  25. import javax.xml.soap.AttachmentPart;
  26. import javax.xml.soap.SOAPElement;

  27. import org.openspcoop2.message.OpenSPCoop2Message;
  28. import org.openspcoop2.message.OpenSPCoop2MessageFactory;
  29. import org.openspcoop2.message.soap.SoapUtils;
  30. import org.openspcoop2.message.soap.mtom.MTOMUtilities;
  31. import org.openspcoop2.protocol.sdi.config.SDIProperties;
  32. import org.openspcoop2.protocol.sdi.constants.SDICostanti;
  33. import org.openspcoop2.protocol.sdi.constants.SDICostantiServizioRicezioneFatture;
  34. import org.openspcoop2.protocol.sdi.utils.P7MInfo;
  35. import org.openspcoop2.protocol.sdi.utils.SDICompatibilitaNamespaceErrati;
  36. import org.openspcoop2.protocol.sdi.utils.SDIFatturaUtils;
  37. import org.openspcoop2.protocol.sdk.Busta;
  38. import org.openspcoop2.protocol.sdk.Eccezione;
  39. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  40. import org.openspcoop2.protocol.sdk.constants.CodiceErroreCooperazione;
  41. import org.openspcoop2.protocol.sdk.validator.ProprietaValidazione;
  42. import org.openspcoop2.utils.Utilities;
  43. import org.openspcoop2.utils.io.Base64Utilities;
  44. import org.openspcoop2.utils.xml.AbstractValidatoreXSD;
  45. import org.w3c.dom.Document;
  46. import org.w3c.dom.Element;

  47. import it.gov.agenziaentrate.ivaservizi.docs.xsd.fattura.messaggi.v1_0.FileMetadatiType;
  48. import it.gov.fatturapa.sdi.messaggi.v1_0.MetadatiInvioFileType;
  49. import it.gov.fatturapa.sdi.messaggi.v1_0.NotificaDecorrenzaTerminiType;
  50. import it.gov.fatturapa.sdi.messaggi.v1_0.constants.TipiMessaggi;
  51. import it.gov.fatturapa.sdi.ws.ricezione.v1_0.types.utils.ProjectInfo;

  52. /**
  53.  * SDIValidatoreServizioRicezioneFatture
  54.  *
  55.  * @author Andrea Poli (apoli@link.it)
  56.  * @author $Author$
  57.  * @version $Rev$, $Date$
  58.  */
  59. public class SDIValidatoreServizioRicezioneFatture {

  60.     private SDIValidazioneSintattica sdiValidazioneSintattica;
  61.     private SDIValidazioneSemantica sdiValidazioneSemantica;
  62.     private ProprietaValidazione proprietaValidazioneSemantica;
  63.     private OpenSPCoop2Message msg;
  64.     private OpenSPCoop2MessageFactory messageFactory;
  65.     private boolean isRichiesta;
  66.     private SOAPElement sdiMessage;
  67.     private String namespace;
  68.     private Busta busta;
  69.            
  70.    
  71.     public SDIValidatoreServizioRicezioneFatture(SDIValidazioneSintattica sdiValidazioneSintattica,
  72.             OpenSPCoop2Message msg,boolean isRichiesta,
  73.             SOAPElement sdiMessage,Busta busta){
  74.         this.sdiValidazioneSintattica = sdiValidazioneSintattica;
  75.         this.msg = msg;
  76.         this.messageFactory = this.msg!=null ? this.msg.getFactory() : OpenSPCoop2MessageFactory.getDefaultMessageFactory();
  77.         this.isRichiesta = isRichiesta;
  78.         this.sdiMessage = sdiMessage;
  79.         this.namespace = ProjectInfo.getInstance().getProjectNamespace();
  80.         this.busta = busta;
  81.     }
  82.     public SDIValidatoreServizioRicezioneFatture(SDIValidazioneSemantica sdiValidazioneSemantica, ProprietaValidazione proprietaValidazione,
  83.             OpenSPCoop2Message msg,boolean isRichiesta,
  84.             SOAPElement sdiMessage,Busta busta){
  85.         this.sdiValidazioneSemantica = sdiValidazioneSemantica;
  86.         this.proprietaValidazioneSemantica = proprietaValidazione;
  87.         this.msg = msg;
  88.         this.messageFactory = this.msg!=null ? this.msg.getFactory() : OpenSPCoop2MessageFactory.getDefaultMessageFactory();
  89.         this.isRichiesta = isRichiesta;
  90.         this.sdiMessage = sdiMessage;
  91.         this.namespace = SDICostantiServizioRicezioneFatture.RICEZIONE_SERVIZIO_RICEZIONE_FATTURE_NAMESPACE;
  92.         this.busta = busta;
  93.     }
  94.    
  95.     private boolean checkServiceNamespace() throws Exception{
  96.         if(this.namespace.equals(this.sdiMessage.getNamespaceURI())==false){
  97.             this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  98.                     "Namespace ["+this.sdiMessage.getNamespaceURI()+"] differente da quello atteso ["+this.namespace+"]"));
  99.             return false;  
  100.         }
  101.         return true;
  102.     }
  103.    
  104.    
  105.    
  106.     /* ***** validaRiceviFatture ***** */
  107.        
  108.     public void validaRiceviFatture() throws Exception{
  109.        
  110.         if(checkServiceNamespace()==false){
  111.             return;
  112.         }
  113.        
  114.         if(this.sdiValidazioneSintattica!=null){
  115.             if(this.isRichiesta){
  116.                 this._validazioneSintattica_RiceviFatture_richiesta();
  117.             }
  118.             else{
  119.                 throw new Exception("NotImplemented"); // l'engine non dovrebbe richiedere questo caso.
  120.             }
  121.         }
  122.         else{
  123.             if(this.isRichiesta){
  124.                 this._validazioneSemantica_RiceviFatture_richiesta();
  125.             }
  126.             else{
  127.                 throw new Exception("NotImplemented"); // l'engine non dovrebbe richiedere questo caso.
  128.             }
  129.         }
  130.        
  131.     }
  132.     private void _validazioneSintattica_RiceviFatture_richiesta() throws Exception{
  133.        
  134.         if(SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ROOT_ELEMENT.equals(this.sdiMessage.getLocalName())==false){
  135.             this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  136.                     "LocalName ["+this.sdiMessage.getLocalName()+"] differente da quello atteso ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ROOT_ELEMENT+"]"));
  137.             return;
  138.         }
  139.        
  140.         List<SOAPElement> elementChilds = SoapUtils.getNotEmptyChildSOAPElement(this.sdiMessage);
  141.         if(elementChilds==null || elementChilds.size()<=0){
  142.             this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  143.                     "RootElement [{"+this.namespace+"}"+this.sdiMessage.getLocalName()+"] non contiene elementi"));
  144.             return;
  145.         }
  146.        
  147.         String identificativoSdI = null;
  148.         String nomeFile = null;
  149.         Boolean fileRead = null;
  150.         String nomeFileMetadati = null;
  151.         Boolean metadatiRead = null;
  152.         for (int i = 0; i < elementChilds.size(); i++) {
  153.             SOAPElement child = elementChilds.get(i);
  154.    
  155.             if(SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_IDENTIFICATIVO_SDI.equals(child.getLocalName())){
  156.                 if(identificativoSdI!=null){
  157.                     this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
  158.                             validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_PRESENTE_PIU_VOLTE));
  159.                     return;
  160.                 }
  161.                 if(child.getTextContent()==null){
  162.                     this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
  163.                             validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_VALORIZZATO));
  164.                     return;
  165.                 }
  166.                 identificativoSdI = child.getTextContent();
  167.             }
  168.             else if(SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_NOME_FILE.equals(child.getLocalName())){
  169.                 if(nomeFile!=null){
  170.                     this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
  171.                             validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  172.                             "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_NOME_FILE+"] presente piu' volte"));
  173.                     return;
  174.                 }
  175.                 if(child.getTextContent()==null){
  176.                     this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
  177.                             validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  178.                             "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_NOME_FILE+"] non valorizzato"));
  179.                     return;
  180.                 }
  181.                 nomeFile = child.getTextContent();
  182.             }
  183.             else if(SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE.equals(child.getLocalName())){
  184.                 if(fileRead!=null){
  185.                     this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
  186.                             validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  187.                             "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE+"] presente piu' volte"));
  188.                     return;
  189.                 }
  190.                 // Il contenuto viene gestito nella validazione semantica (poiche' deve essere applicata la sicurezza per la firma)
  191.                 fileRead = true;
  192.             }
  193.             else if(SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_NOME_FILE_METADATI.equals(child.getLocalName())){
  194.                 if(nomeFileMetadati!=null){
  195.                     this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
  196.                             validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  197.                             "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_NOME_FILE_METADATI+"] presente piu' volte"));
  198.                     return;
  199.                 }
  200.                 if(child.getTextContent()==null){
  201.                     this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
  202.                             validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  203.                             "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_NOME_FILE_METADATI+"] non valorizzato"));
  204.                     return;
  205.                 }
  206.                 nomeFileMetadati = child.getTextContent();  
  207.             }
  208.             else if(SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_METADATI.equals(child.getLocalName())){
  209.                 if(metadatiRead!=null){
  210.                     this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
  211.                             validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  212.                             "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_METADATI+"] presente piu' volte"));
  213.                     return;
  214.                 }
  215.                 // Il contenuto viene gestito nella validazione semantica (poiche' deve essere applicata la sicurezza per la firma)
  216.                 metadatiRead = true;    
  217.             }
  218.             else{
  219.                 this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  220.                         "Element ["+child.getLocalName()+"] sconosciuto"));
  221.                 return;
  222.             }
  223.            
  224.             if(child.getNamespaceURI()!=null){
  225.                 this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  226.                         "Element ["+child.getLocalName()+"] appartiene al namespace ("+child.getNamespaceURI()+"). Era atteso un elemento senza namespace"));
  227.                 return;
  228.             }
  229.         }
  230.         if(identificativoSdI==null){
  231.             this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
  232.                     validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_PRESENTE));
  233.             return;
  234.         }
  235.         if(nomeFile==null){
  236.             this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
  237.                     validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  238.                             "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_NOME_FILE+"] non presente"));
  239.             return;
  240.         }
  241.         if(fileRead==null){
  242.             this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
  243.                     validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  244.                             "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE+"] non presente"));
  245.             return;
  246.         }
  247.         if(nomeFileMetadati==null){
  248.             this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
  249.                     validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  250.                             "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_NOME_FILE_METADATI+"] non presente"));
  251.             return;
  252.         }
  253.         if(metadatiRead==null){
  254.             this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
  255.                     validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  256.                             "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_METADATI+"] non presente"));
  257.             return;
  258.         }
  259.        
  260.        
  261.         // nomeFile
  262.         try{
  263.             SDIValidatoreNomeFile.validaNomeFileFattura(nomeFile, true);
  264.             if(nomeFile.toLowerCase().endsWith(SDICostanti.SDI_FATTURA_ESTENSIONE_P7M)){
  265.                 this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_FORMATO_ARCHIVIO_INVIO_FATTURA, SDICostanti.SDI_TIPO_FATTURA_P7M);
  266.             }
  267.             else{
  268.                 this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_FORMATO_ARCHIVIO_INVIO_FATTURA, SDICostanti.SDI_TIPO_FATTURA_XML);
  269.             }
  270.         }catch(Exception e){
  271.             this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
  272.                     validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  273.                             "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_NOME_FILE+"] non valido: "+e.getMessage(),e,
  274.                             !this.sdiValidazioneSintattica.sdiProperties.isEnableValidazioneNomeFile()));
  275.             if(this.sdiValidazioneSintattica.sdiProperties.isEnableValidazioneNomeFile()){
  276.                 return;
  277.             }
  278.         }
  279.        
  280.         // nomeFileMetadati
  281.         try{
  282.             SDIValidatoreNomeFile.validaNomeFileMessaggi(nomeFile, nomeFileMetadati, TipiMessaggi.MT);
  283.         }catch(Exception e){
  284.             this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
  285.                     validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  286.                             "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_NOME_FILE_METADATI+"] non valido: "+e.getMessage(),e,
  287.                             !this.sdiValidazioneSintattica.sdiProperties.isEnableValidazioneNomeFile()));
  288.             if(this.sdiValidazioneSintattica.sdiProperties.isEnableValidazioneNomeFile()){
  289.                 return;
  290.             }
  291.         }
  292.        
  293.        
  294.         // setto i valori sdi nella busta
  295.         this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_IDENTIFICATIVO_SDI, identificativoSdI);
  296.         this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_NOME_FILE, nomeFile);
  297.         this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_NOME_FILE_METADATI, nomeFileMetadati);
  298.        
  299. //      NOTA: Il contenuto viene gestito nella validazione semantica (poiche' deve essere applicata la sicurezza per la firma)
  300. //      // metadati
  301. //      if(metadati!=null){
  302. //          this._validazioneMetadati(metadati,this.sdiValidazioneSintattica.sdiProperties,this.sdiValidazioneSintattica.erroriValidazione,
  303. //                  this.sdiValidazioneSintattica.validazioneUtils,this.sdiValidazioneSintattica.getProtocolFactory());
  304. //      }
  305. //      
  306. //      // fattura
  307. //      if(file!=null){
  308. //          this._validazioneFattura(file,this.sdiValidazioneSintattica.sdiProperties,this.sdiValidazioneSintattica.erroriValidazione,
  309. //                  this.sdiValidazioneSintattica.validazioneUtils,this.sdiValidazioneSintattica.getProtocolFactory());
  310. //      }
  311.        
  312.        
  313.     }
  314.    
  315.     private void _validazioneSemantica_RiceviFatture_richiesta() throws Exception{
  316.        
  317. //      NOTA: Il contenuto viene gestito nella validazione semantica (poiche' deve essere applicata la sicurezza per la firma)
  318.         // Questo if sara' sempre vero
  319.         if(this.busta.getProperty(SDICostanti.SDI_BUSTA_EXT_MESSAGE_ID)==null){
  320.        
  321.             /* **** METADATI **** */
  322.            
  323.             byte[] metadati = null;
  324.             try{
  325.                 // la validazione sintattica garantisce la presenza
  326.                 QName qnameMetadati = new QName(SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_METADATI);
  327.                 Iterator<?> nodeMetadatiIt = this.sdiMessage.getChildElements(qnameMetadati);
  328.                 SOAPElement nodeMetadati = (SOAPElement) nodeMetadatiIt.next();
  329.                
  330.                 Element xomReference = MTOMUtilities.getIfExistsXomReference(this.messageFactory, nodeMetadati);
  331.                 if(xomReference!=null){
  332.                     try{
  333.                         String cid = MTOMUtilities.getCidXomReference(xomReference);
  334.                         if(cid==null){
  335.                             throw new Exception("XomReference without cid reference");
  336.                         }
  337.                         AttachmentPart ap = MTOMUtilities.getAttachmentPart(this.msg, cid);
  338.                         metadati = Utilities.getAsByteArray(ap.getDataHandler().getInputStream());
  339.                         if(metadati==null || metadati.length<=0){
  340.                             throw new Exception("Contenuto non presente");
  341.                         }
  342.                     }catch(Exception e){
  343.                         this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
  344.                                 validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  345.                                 "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE+"] non valorizzato correttamente: "+e.getMessage(),e));
  346.                         return;
  347.                     }
  348.                 }else{
  349.                     if(nodeMetadati.getTextContent()==null){
  350.                         this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
  351.                                 validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  352.                                 "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_METADATI+"] non valorizzato"));
  353.                         return;
  354.                     }
  355.                     String base64Metadati = nodeMetadati.getTextContent();
  356.                     if(base64Metadati==null || "".equals(base64Metadati)){
  357.                         throw new Exception("Codifica Base64 non presente");
  358.                     }
  359.                     try{
  360.                         metadati = Base64Utilities.decode(base64Metadati);
  361.                     }catch(Exception e){
  362.                         // un errore non dovrebbe mai capitare, la validazione sintattica garantisce la presenza
  363.                         this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
  364.                                 validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  365.                                 "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_METADATI+"] decodifica base64 non riuscita: "+e.getMessage(),e));
  366.                         return;
  367.                     }
  368.                 }
  369.                
  370.                
  371.             }catch(Exception e){
  372.                 // un errore non dovrebbe mai capitare, la validazione sintattica garantisce la presenza
  373.                 this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
  374.                         validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  375.                         "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_METADATI+"] non accessibile: "+e.getMessage(),e));
  376.                 return;
  377.             }
  378.             boolean validazioneMetadatiOk =
  379.                     this._validazioneMetadati(metadati,this.sdiValidazioneSemantica.sdiProperties,this.sdiValidazioneSemantica.erroriValidazione,
  380.                     this.sdiValidazioneSemantica.validazioneUtils,this.sdiValidazioneSemantica.getProtocolFactory());
  381.             if(!validazioneMetadatiOk){
  382.                 return;
  383.             }
  384.            
  385.             if(metadati!=null && this.sdiValidazioneSemantica.sdiProperties.isEnable_fatturazionePassiva_consegnaFileMetadati()) {
  386.                 this.msg.forceTransportHeader(SDICostanti.SDI_HEADER_FILE_METADATI, Base64Utilities.encodeAsString(metadati));
  387.             }
  388.            
  389.            
  390.             /* **** FATTURA **** */
  391.            
  392.             byte[] fattura = null;
  393.             try{
  394.                 // la validazione sintattica garantisce la presenza
  395.                 QName qnameFattura = new QName(SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE);
  396.                 Iterator<?> nodeFatturaIt = this.sdiMessage.getChildElements(qnameFattura);
  397.                 SOAPElement nodeFattura = (SOAPElement) nodeFatturaIt.next();
  398.                
  399.                 Element xomReference = MTOMUtilities.getIfExistsXomReference(this.messageFactory, nodeFattura);
  400.                 if(xomReference!=null){
  401.                     try{
  402.                         String cid = MTOMUtilities.getCidXomReference(xomReference);
  403.                         if(cid==null){
  404.                             throw new Exception("XomReference without cid reference");
  405.                         }
  406.                         AttachmentPart ap = MTOMUtilities.getAttachmentPart(this.msg, cid);
  407.                         fattura = Utilities.getAsByteArray(ap.getDataHandler().getInputStream());
  408.                         if(fattura==null || fattura.length<=0){
  409.                             throw new Exception("Contenuto non presente");
  410.                         }
  411.                     }catch(Exception e){
  412.                         this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
  413.                                 validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  414.                                 "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE+"] non valorizzato correttamente: "+e.getMessage(),e));
  415.                         return;
  416.                     }
  417.                 }else{
  418.                     if(nodeFattura.getTextContent()==null){
  419.                         this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
  420.                                 validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  421.                                 "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE+"] non valorizzato"));
  422.                         return;
  423.                     }
  424.                     String base64Fattura = nodeFattura.getTextContent();
  425.                     if(base64Fattura==null || "".equals(base64Fattura)){
  426.                         throw new Exception("Codifica Base64 non presente");
  427.                     }
  428.                     try{
  429.                         fattura = Base64Utilities.decode(base64Fattura);
  430.                     }catch(Exception e){
  431.                         this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
  432.                                 validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  433.                                 "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE+"] decodifica base64 non riuscita: "+e.getMessage(),e));
  434.                         return;
  435.                     }
  436.                 }
  437.                
  438.             }catch(Exception e){
  439.                 // un errore non dovrebbe mai capitare, la validazione sintattica garantisce la presenza
  440.                 this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
  441.                         validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  442.                         "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE+"] non accessibile: "+e.getMessage(),e));
  443.                 return;
  444.             }
  445.            
  446.             // Il formato viene compreso durante la validazione sintattica
  447.             Object formato = this.busta.getProperty(SDICostanti.SDI_BUSTA_EXT_FORMATO_ARCHIVIO_INVIO_FATTURA);
  448.             byte [] tmpFatturaP7M = null;
  449.             if(formato==null){
  450.                 // La validazione sintattica non ha compreso il formato della fattura, per via di errori sulla nomenclatura del file.
  451.                 // La validazione del nome file e' disabilitata se si arriva a questo punto.
  452.                 // Si prova a comprendere il tipo di formato esaminando direttamente la fattura
  453.                
  454.                 // provo a vedere se e' XML (XaDEs)
  455.                 try{
  456.                     if(it.gov.fatturapa.sdi.fatturapa.v1_0.utils.XMLUtils.isFattura(fattura)){
  457.                         this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_FORMATO_ARCHIVIO_INVIO_FATTURA, SDICostanti.SDI_TIPO_FATTURA_XML);
  458.                         formato = SDICostanti.SDI_TIPO_FATTURA_XML;
  459.                     }
  460.                 }catch(Throwable e){
  461.                     // ignore
  462.                 }
  463.                 if(formato==null){
  464.                     try{
  465.                         if(it.gov.fatturapa.sdi.fatturapa.v1_1.utils.XMLUtils.isFattura(fattura)){
  466.                             this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_FORMATO_ARCHIVIO_INVIO_FATTURA, SDICostanti.SDI_TIPO_FATTURA_XML);
  467.                             formato = SDICostanti.SDI_TIPO_FATTURA_XML;
  468.                         }
  469.                     }catch(Throwable e){
  470.                         // ignore
  471.                     }
  472.                 }
  473.                 if(formato==null){
  474.                     try{
  475.                         if(it.gov.agenziaentrate.ivaservizi.docs.xsd.fatture.v1_2.utils.XMLUtils.isFattura(fattura)){
  476.                             this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_FORMATO_ARCHIVIO_INVIO_FATTURA, SDICostanti.SDI_TIPO_FATTURA_XML);
  477.                             formato = SDICostanti.SDI_TIPO_FATTURA_XML;
  478.                         }
  479.                     }catch(Throwable e){
  480.                         // ignore
  481.                     }
  482.                 }
  483.                
  484.                 // provo a vedere se e' un P7M (CaDES)
  485.                 if(formato==null){
  486.                     try{
  487.                         P7MInfo infoP7M = new P7MInfo(fattura, this.sdiValidazioneSemantica.getProtocolFactory().getLogger());
  488.                         tmpFatturaP7M = infoP7M.getXmlDecoded();
  489.                         if(tmpFatturaP7M!=null){
  490.                             this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_FORMATO_ARCHIVIO_INVIO_FATTURA, SDICostanti.SDI_TIPO_FATTURA_P7M);
  491.                             this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_FORMATO_ARCHIVIO_BASE64, infoP7M.isBase64Encoded()+"");
  492.                             formato = SDICostanti.SDI_TIPO_FATTURA_P7M;
  493.                         }
  494.                     }catch(Throwable e){
  495.                         // ignore
  496.                     }
  497.                 }
  498.                
  499.                 if(formato==null){
  500.                     // formato non riconosciuto, non posso continuare ulteriormente
  501.                     this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
  502.                             validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  503.                                     "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE+"] decodifica non riuscita: formato non conosciuto"));
  504.                     return;
  505.                 }
  506.             }
  507.            
  508.             // Se la fattura e' un P7M per poterla validare devo estrarne il contenuto.
  509.             if(((String)formato).equals(SDICostanti.SDI_TIPO_FATTURA_P7M) &&
  510.                     (this.sdiValidazioneSemantica.sdiProperties.isEnableAccessoFattura() || this.sdiValidazioneSemantica.sdiProperties.isEnableValidazioneXsdFattura() ) ){
  511.                 if(tmpFatturaP7M==null){
  512.                     try{
  513.                         P7MInfo infoP7M = new P7MInfo(fattura, this.sdiValidazioneSemantica.getProtocolFactory().getLogger());
  514.                         fattura = infoP7M.getXmlDecoded();
  515.                         this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_FORMATO_ARCHIVIO_BASE64, infoP7M.isBase64Encoded()+"");
  516.                     }catch(Throwable e){
  517.                         this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
  518.                                 validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  519.                                         "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE+"] decodifica p7m non riuscita: "+e.getMessage(),e));
  520.                         return;
  521.                     }
  522.                 }
  523.                 else{
  524.                     fattura = tmpFatturaP7M;
  525.                 }
  526.             }

  527.             SDIFatturaUtils.validazioneFattura(fattura,this.sdiValidazioneSemantica.sdiProperties,this.sdiValidazioneSemantica.erroriValidazione,
  528.                     this.sdiValidazioneSemantica.validazioneUtils,this.sdiValidazioneSemantica.getProtocolFactory(),
  529.                     this.busta,this.msg,true,true,false);
  530.            
  531.             // Posizione (Se abilitato lo split verra' re-impostato correttamente questo valore)
  532.             this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_POSIZIONE_FATTURA_PA, 1+"");
  533.            
  534.         }
  535.     }
  536.    
  537.     private boolean _validazioneMetadati(byte[] metadati, SDIProperties sdiProperties,
  538.             List<Eccezione> eccezioniValidazione, SDIValidazioneUtils validazioneUtils, IProtocolFactory<?> protocolFactory) throws Exception{
  539.    
  540.         boolean forceEccezioneLivelloInfo = false;
  541.         if(sdiProperties.isEnableAccessoMetadati() == false) {
  542.             return true;
  543.         }
  544.         else if(sdiProperties.isEnableAccessoMetadatiWarningMode()) {
  545.             forceEccezioneLivelloInfo = true;
  546.         }
  547.        
  548.        
  549.         boolean fatturaB2B = false;
  550.         if(it.gov.agenziaentrate.ivaservizi.docs.xsd.fattura.messaggi.v1_0.utils.XMLUtils.isNotificaB2B(metadati)) {
  551.             fatturaB2B = true;
  552.         }
  553.         else if(it.gov.fatturapa.sdi.messaggi.v1_0.utils.XMLUtils.isNotificaPA(metadati, sdiProperties.isEnableValidazioneMessaggiCompatibilitaNamespaceSenzaGov())) {
  554.             fatturaB2B = false;
  555.         }
  556.         else {
  557.             String namespace = null;
  558.             Throwable eMalformato = null;
  559.             try {
  560.                 org.openspcoop2.message.xml.MessageXMLUtils xmlUtils = org.openspcoop2.message.xml.MessageXMLUtils.getInstance(this.messageFactory);
  561.                 Document docXML = xmlUtils.newDocument(metadati);
  562.                 Element elemXML = docXML.getDocumentElement();
  563.                 namespace = elemXML.getNamespaceURI();
  564.             }catch(Throwable t) {
  565.                 eMalformato = t;
  566.             }
  567.             if(namespace!=null) {
  568.                 eccezioniValidazione.add(
  569.                     validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  570.                             "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_METADATI+"] contiene un namespace ("+namespace+") sconosciuto",
  571.                             forceEccezioneLivelloInfo));
  572.             }
  573.             else {
  574.                 eccezioniValidazione.add(
  575.                         validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  576.                                 "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_METADATI+"] contiene un xml malformato: "+eMalformato.getMessage(),eMalformato,
  577.                                 forceEccezioneLivelloInfo));
  578.             }
  579.             return false; // esco anche in caso di forceEccezioneLivelloInfo poiche' i metadati non sono ben formati e non ha senso andare avanti
  580.         }
  581.        
  582.        
  583.         // validazione XSD file Metadati
  584.         if(sdiProperties.isEnableValidazioneXsdMetadati()){
  585.             try{
  586.                 if(fatturaB2B) {
  587.                     AbstractValidatoreXSD validatore =
  588.                             it.gov.agenziaentrate.ivaservizi.docs.xsd.fattura.messaggi.v1_0.utils.XSDValidatorWithSignature.getOpenSPCoop2MessageXSDValidator(protocolFactory.getLogger());
  589.                     validatore.valida(new ByteArrayInputStream(metadati));
  590.                 }
  591.                 else {
  592.                     AbstractValidatoreXSD validatore =
  593.                             it.gov.fatturapa.sdi.messaggi.v1_0.utils.XSDValidatorWithSignature.getOpenSPCoop2MessageXSDValidator(protocolFactory.getLogger());
  594.                     validatore.valida(new ByteArrayInputStream(metadati));
  595.                 }
  596.             }catch(Exception e){
  597.                 eccezioniValidazione.add(
  598.                         validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  599.                                 "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_METADATI+"] contiene un file Metadati non valido rispetto allo schema XSD: "+
  600.                                         e.getMessage(),e, forceEccezioneLivelloInfo));
  601.                 return false; // esco anche in caso di forceEccezioneLivelloInfo poiche' i metadati non sono ben formati e non ha senso andare avanti
  602.             }
  603.         }
  604.        
  605.         // Lettura metadati
  606.        
  607.         if(fatturaB2B) {
  608.            
  609.             FileMetadatiType metadatiObject = null;
  610.             try{
  611.                 it.gov.agenziaentrate.ivaservizi.docs.xsd.fattura.messaggi.v1_0.utils.serializer.JaxbDeserializer deserializer =
  612.                         new it.gov.agenziaentrate.ivaservizi.docs.xsd.fattura.messaggi.v1_0.utils.serializer.JaxbDeserializer();
  613.                 metadatiObject = deserializer.readFileMetadatiType(metadati);
  614.                 if(sdiProperties.isSaveFatturaInContext()){
  615.                     this.msg.addContextProperty(SDICostanti.SDI_MESSAGE_CONTEXT_FATTURA_METADATI, metadatiObject);
  616.                     this.msg.addContextProperty(SDICostanti.SDI_MESSAGE_CONTEXT_FATTURA_METADATI_BYTES, metadati);
  617.                 }
  618.             }catch(Exception e){
  619.                 eccezioniValidazione.add(
  620.                         validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  621.                                 "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_METADATI+"] contiene un file Metadati non valido: "+e.getMessage(),e,
  622.                                 forceEccezioneLivelloInfo));
  623.                 return false; // esco anche in caso di forceEccezioneLivelloInfo poiche' i metadati non sono ben formati e non ha senso andare avanti
  624.             }
  625.            
  626.             // Metadati.IdentificativoSdI
  627.             String identificativoSdILettoInValidazioneSintattica = this.busta.getProperty(SDICostanti.SDI_BUSTA_EXT_IDENTIFICATIVO_SDI);
  628.             if(identificativoSdILettoInValidazioneSintattica.equals(metadatiObject.getIdentificativoSdI().toString())==false){
  629.                 eccezioniValidazione.add(
  630.                         validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_VALIDO,
  631.                                 "Identificativo presente nel messaggio SdI ["+identificativoSdILettoInValidazioneSintattica+
  632.                                 "] differente da quello presente nel file Metadati ["+metadatiObject.getIdentificativoSdI().toString()+"]",
  633.                                 !sdiProperties.isEnableValidazioneCampiInterniMetadati()));
  634.                 if(sdiProperties.isEnableValidazioneCampiInterniMetadati()){
  635.                     return false;  
  636.                 }
  637.             }
  638.            
  639.            
  640.             // Metadati.NomeFile
  641.             String nomeFileLettoInValidazioneSintattica = this.busta.getProperty(SDICostanti.SDI_BUSTA_EXT_NOME_FILE);
  642.             if(nomeFileLettoInValidazioneSintattica.equals(metadatiObject.getNomeFile())==false){
  643.                 eccezioniValidazione.add(
  644.                         validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  645.                                 "NomeFile presente nel messaggio SdI ["+nomeFileLettoInValidazioneSintattica+
  646.                                 "] differente da quello presente nel file Metadati ["+metadatiObject.getNomeFile()+"]",
  647.                                 !sdiProperties.isEnableValidazioneCampiInterniMetadati()));
  648.                 if(sdiProperties.isEnableValidazioneCampiInterniMetadati()){
  649.                     return false;  
  650.                 }
  651.             }
  652.                    
  653.             // Hash
  654.             if(metadatiObject.getHash()!=null){
  655.                 this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_HASH_IN_NOTIFICA, metadatiObject.getHash());
  656.             }
  657.            
  658.             // Metadati.CodiceDestinatario
  659.             this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_CODICE_DESTINATARIO, metadatiObject.getCodiceDestinatario());
  660.            
  661.             // Metadati.FormatoFattura (validazione necessaria per riconoscere poi il tipo di fattura da parsare)
  662.             String formatoFattura = metadatiObject.getFormato();
  663.             if(!SDICostanti.SDI_VERSIONE_FATTURA_PA_10.equals(formatoFattura) &&
  664.                 !SDICostanti.SDI_VERSIONE_FATTURA_PA_11.equals(formatoFattura) &&
  665.                 !SDICostanti.SDI_VERSIONE_FATTURA_SEMPLIFICATA_10.equals(formatoFattura) &&
  666.                 !SDICostanti.SDI_VERSIONE_FATTURA_PA_12.equals(formatoFattura) &&
  667.                 !SDICostanti.SDI_VERSIONE_FATTURA_PR_12.equals(formatoFattura) ){
  668.                 eccezioniValidazione.add(
  669.                         validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  670.                                 "FormatoFattura presente nei metadati ["+formatoFattura+
  671.                                 "] non valido"));
  672.                 return false;  
  673.             }
  674.             this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_VERSIONE_FATTURA_PA, formatoFattura);
  675.            
  676.             // Metadati.TentativiInvio
  677.             this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_TENTATIVI_INVIO, metadatiObject.getTentativiInvio().toString());
  678.            
  679.             // Metadati.MessageId
  680.             this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_MESSAGE_ID, metadatiObject.getMessageId());
  681.            
  682.             // Metadati.Note
  683.             if(metadatiObject.getNote()!=null)
  684.                 this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_NOTE, metadatiObject.getNote());
  685.            
  686.         }
  687.         else {
  688.        
  689.             MetadatiInvioFileType metadatiObject = null;
  690.             try{
  691.                 it.gov.fatturapa.sdi.messaggi.v1_0.utils.serializer.JaxbDeserializer deserializer =
  692.                         new it.gov.fatturapa.sdi.messaggi.v1_0.utils.serializer.JaxbDeserializer();
  693.                 metadatiObject = deserializer.readMetadatiInvioFileType(metadati);
  694.                 if(sdiProperties.isSaveFatturaInContext()){
  695.                     this.msg.addContextProperty(SDICostanti.SDI_MESSAGE_CONTEXT_FATTURA_METADATI, metadatiObject);
  696.                     this.msg.addContextProperty(SDICostanti.SDI_MESSAGE_CONTEXT_FATTURA_METADATI_BYTES, metadati);
  697.                 }
  698.             }catch(Exception e){
  699.                 eccezioniValidazione.add(
  700.                         validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  701.                                 "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_METADATI+"] contiene un file Metadati non valido: "+
  702.                                         e.getMessage(),e, forceEccezioneLivelloInfo));
  703.                 return false; // esco anche in caso di forceEccezioneLivelloInfo poiche' i metadati non sono ben formati e non ha senso andare avanti
  704.             }
  705.            
  706.             // Metadati.IdentificativoSdI
  707.             String identificativoSdILettoInValidazioneSintattica = this.busta.getProperty(SDICostanti.SDI_BUSTA_EXT_IDENTIFICATIVO_SDI);
  708.             if(identificativoSdILettoInValidazioneSintattica.equals(metadatiObject.getIdentificativoSdI().toString())==false){
  709.                 eccezioniValidazione.add(
  710.                         validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_VALIDO,
  711.                                 "Identificativo presente nel messaggio SdI ["+identificativoSdILettoInValidazioneSintattica+
  712.                                 "] differente da quello presente nel file Metadati ["+metadatiObject.getIdentificativoSdI().toString()+"]",
  713.                                 !sdiProperties.isEnableValidazioneCampiInterniMetadati()));
  714.                 if(sdiProperties.isEnableValidazioneCampiInterniMetadati()){
  715.                     return false;  
  716.                 }
  717.             }
  718.            
  719.            
  720.             // Metadati.NomeFile
  721.             String nomeFileLettoInValidazioneSintattica = this.busta.getProperty(SDICostanti.SDI_BUSTA_EXT_NOME_FILE);
  722.             if(nomeFileLettoInValidazioneSintattica.equals(metadatiObject.getNomeFile())==false){
  723.                 eccezioniValidazione.add(
  724.                         validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  725.                                 "NomeFile presente nel messaggio SdI ["+nomeFileLettoInValidazioneSintattica+
  726.                                 "] differente da quello presente nel file Metadati ["+metadatiObject.getNomeFile()+"]",
  727.                                 !sdiProperties.isEnableValidazioneCampiInterniMetadati()));
  728.                 if(sdiProperties.isEnableValidazioneCampiInterniMetadati()){
  729.                     return false;  
  730.                 }
  731.             }
  732.                    
  733.             // Metadati.CodiceDestinatario
  734.             this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_CODICE_DESTINATARIO, metadatiObject.getCodiceDestinatario());
  735.            
  736.             // Metadati.FormatoFattura (validazione necessaria per riconoscere poi il tipo di fattura da parsare)
  737.             String formatoFattura = metadatiObject.getFormato();
  738.             if(!SDICostanti.SDI_VERSIONE_FATTURA_PA_10.equals(formatoFattura) &&
  739.                 !SDICostanti.SDI_VERSIONE_FATTURA_PA_11.equals(formatoFattura) &&
  740.                 !SDICostanti.SDI_VERSIONE_FATTURA_SEMPLIFICATA_10.equals(formatoFattura) &&
  741.                 !SDICostanti.SDI_VERSIONE_FATTURA_PA_12.equals(formatoFattura) &&
  742.                 !SDICostanti.SDI_VERSIONE_FATTURA_PR_12.equals(formatoFattura) ){
  743.                 eccezioniValidazione.add(
  744.                         validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  745.                                 "FormatoFattura presente nei metadati ["+formatoFattura+
  746.                                 "] non valido"));
  747.                 return false;  
  748.             }
  749.             this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_VERSIONE_FATTURA_PA, formatoFattura);
  750.            
  751.             // Metadati.TentativiInvio
  752.             this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_TENTATIVI_INVIO, metadatiObject.getTentativiInvio().toString());
  753.            
  754.             // Metadati.MessageId
  755.             this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_MESSAGE_ID, metadatiObject.getMessageId());
  756.            
  757.             // Metadati.Note
  758.             if(metadatiObject.getNote()!=null)
  759.                 this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_NOTE, metadatiObject.getNote());
  760.            
  761.         }
  762.        
  763.         return true;
  764.     }
  765.    
  766.    
  767.    
  768.    
  769.    
  770.    
  771.    
  772.    
  773.     /* ***** validaNotificaDecorrenzaTermini ***** */
  774.    
  775.     public void validaNotificaDecorrenzaTermini() throws Exception{
  776.        
  777.         if(checkServiceNamespace()==false){
  778.             return;
  779.         }
  780.        
  781.         if(this.sdiValidazioneSintattica!=null){
  782.             if(this.isRichiesta){
  783.                 this._validazioneSintattica_FileSdiType_richiesta(SDICostantiServizioRicezioneFatture.NOTIFICA_DECORRENZA_TERMINI_RICHIESTA_ROOT_ELEMENT,
  784.                         TipiMessaggi.DT);
  785.             }
  786.             else{
  787.                 throw new Exception("NotImplemented"); // l'engine non dovrebbe richiedere questo caso.
  788.             }
  789.         }
  790.         else{
  791.             if(this.isRichiesta){
  792.                 this._validazioneSemantica_FileSdiType_richiesta(TipiMessaggi.DT);
  793.             }
  794.             else{
  795.                 throw new Exception("NotImplemented"); // l'engine non dovrebbe richiedere questo caso.
  796.             }
  797.         }
  798.        
  799.     }
  800.    
  801.     private void _validazioneSintattica_FileSdiType_richiesta(String rootElement,TipiMessaggi tipoMessaggio) throws Exception{
  802.        
  803.         if(rootElement.equals(this.sdiMessage.getLocalName())==false){
  804.             this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  805.                     "LocalName ["+this.sdiMessage.getLocalName()+"] differente da quello atteso ["+rootElement+"]"));
  806.             return;
  807.         }
  808.        
  809.         List<SOAPElement> elementChilds = SoapUtils.getNotEmptyChildSOAPElement(this.sdiMessage);
  810.         if(elementChilds==null || elementChilds.size()<=0){
  811.             this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  812.                     "RootElement [{"+this.namespace+"}"+this.sdiMessage.getLocalName()+"] non contiene elementi"));
  813.             return;
  814.         }
  815.        
  816.         String identificativoSdI = null;
  817.         String nomeFile = null;
  818.         Boolean fileRead = null;
  819.         for (int i = 0; i < elementChilds.size(); i++) {
  820.             SOAPElement child = elementChilds.get(i);
  821.    
  822.             if(SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_RICHIESTA_ELEMENT_IDENTIFICATIVO_SDI.equals(child.getLocalName())){
  823.                 if(identificativoSdI!=null){
  824.                     this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
  825.                             validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_PRESENTE_PIU_VOLTE));
  826.                     return;
  827.                 }
  828.                 if(child.getTextContent()==null){
  829.                     this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
  830.                             validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_VALORIZZATO));
  831.                     return;
  832.                 }
  833.                 identificativoSdI = child.getTextContent();
  834.             }
  835.             else if(SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_NOME_FILE.equals(child.getLocalName())){
  836.                 if(nomeFile!=null){
  837.                     this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
  838.                             validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  839.                             "Elemento ["+SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_NOME_FILE+"] presente piu' volte"));
  840.                     return;
  841.                 }
  842.                 if(child.getTextContent()==null){
  843.                     this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
  844.                             validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  845.                             "Elemento ["+SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_NOME_FILE+"] non valorizzato"));
  846.                     return;
  847.                 }
  848.                 nomeFile = child.getTextContent();
  849.             }
  850.             else if(SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_FILE.equals(child.getLocalName())){
  851.                 if(fileRead!=null){
  852.                     this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
  853.                             validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  854.                             "Elemento ["+SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_FILE+"] presente piu' volte"));
  855.                     return;
  856.                 }
  857.                 // Il contenuto viene gestito nella validazione semantica (poiche' deve essere applicata la sicurezza per la firma)
  858.                 fileRead = true;
  859.             }
  860.             else{
  861.                 this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  862.                         "Element ["+child.getLocalName()+"] sconosciuto"));
  863.                 return;
  864.             }
  865.            
  866.             if(child.getNamespaceURI()!=null){
  867.                 this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  868.                         "Element ["+child.getLocalName()+"] appartiene al namespace ("+child.getNamespaceURI()+"). Era atteso un elemento senza namespace"));
  869.                 return;
  870.             }
  871.         }
  872.         if(identificativoSdI==null){
  873.             this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
  874.                     validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_PRESENTE));
  875.             return;
  876.         }
  877.         if(nomeFile==null){
  878.             this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
  879.                     validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  880.                             "Elemento ["+SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_NOME_FILE+"] non presente"));
  881.             return;
  882.         }
  883.         if(fileRead==null){
  884.             this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
  885.                     validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  886.                             "Elemento ["+SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_FILE+"] non presente"));
  887.             return;
  888.         }
  889.        
  890.        
  891.         // nomeFile
  892.         try{
  893.             SDIValidatoreNomeFile.validaNomeFileMessaggi(nomeFile, tipoMessaggio);
  894.         }catch(Exception e){
  895.             this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
  896.                     validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  897.                             "Elemento ["+SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_NOME_FILE+"] non valido: "+e.getMessage(),e,
  898.                             !this.sdiValidazioneSintattica.sdiProperties.isEnableValidazioneNomeFile()));
  899.             if(this.sdiValidazioneSintattica.sdiProperties.isEnableValidazioneNomeFile()){
  900.                 return;
  901.             }
  902.         }
  903.        
  904.        
  905.         // setto i valori sdi nella busta
  906.         this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_IDENTIFICATIVO_SDI, identificativoSdI);
  907.         this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_NOME_FILE, nomeFile);
  908.        
  909.     }
  910.    
  911.    
  912.     private void _validazioneSemantica_FileSdiType_richiesta(TipiMessaggi tipoMessaggio) throws Exception{
  913.        
  914.            
  915.         byte[] xml = null;
  916.         try{
  917.             // la validazione sintattica garantisce la presenza
  918.             QName qnameFile = new QName(SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_FILE);
  919.             Iterator<?> nodeFileIt = this.sdiMessage.getChildElements(qnameFile);
  920.             SOAPElement nodeFile = (SOAPElement) nodeFileIt.next();
  921.            
  922.             Element xomReference = MTOMUtilities.getIfExistsXomReference(this.messageFactory, nodeFile);
  923.             if(xomReference!=null){
  924.                 try{
  925.                     String cid = MTOMUtilities.getCidXomReference(xomReference);
  926.                     if(cid==null){
  927.                         throw new Exception("XomReference without cid reference");
  928.                     }
  929.                     AttachmentPart ap = MTOMUtilities.getAttachmentPart(this.msg, cid);
  930.                     xml = Utilities.getAsByteArray(ap.getDataHandler().getInputStream());
  931.                     if(xml==null || xml.length<=0){
  932.                         throw new Exception("Contenuto non presente");
  933.                     }
  934.                 }catch(Exception e){
  935.                     this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
  936.                             validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  937.                             "Elemento ["+SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_FILE+"] non valorizzato correttamente: "+e.getMessage(),e));
  938.                     return;
  939.                 }
  940.             }else{
  941.                 if(nodeFile.getTextContent()==null){
  942.                     this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
  943.                             validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  944.                             "Elemento ["+SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_FILE+"] non valorizzato"));
  945.                     return;
  946.                 }
  947.                 String base64File = nodeFile.getTextContent();
  948.                 if(base64File==null || "".equals(base64File)){
  949.                     throw new Exception("Codifica Base64 non presente");
  950.                 }
  951.                 try{
  952.                     xml = Base64Utilities.decode(base64File);
  953.                 }catch(Exception e){
  954.                     // un errore non dovrebbe mai capitare, la validazione sintattica garantisce la presenza
  955.                     this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
  956.                             validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  957.                             "Elemento ["+SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_FILE+"] decodifica base64 non riuscita: "+e.getMessage(),e));
  958.                     return;
  959.                 }
  960.             }
  961.            
  962.            
  963.         }catch(Exception e){
  964.             // un errore non dovrebbe mai capitare, la validazione sintattica garantisce la presenza
  965.             this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
  966.                     validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  967.                     "Elemento ["+SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_FILE+"] non accessibile: "+e.getMessage(),e));
  968.             return;
  969.         }
  970.        
  971.        
  972.         switch (tipoMessaggio) {
  973.            
  974.         case DT:
  975.             this._validazioneDT(xml,this.sdiValidazioneSemantica.sdiProperties,this.sdiValidazioneSemantica.erroriValidazione,
  976.                     this.sdiValidazioneSemantica.validazioneUtils,this.sdiValidazioneSemantica.getProtocolFactory());
  977.             break;

  978.         default:
  979.             break;
  980.         }
  981.        
  982.         // Riporto nella notifica le informazioni della fattura precedentemente ricevuta
  983.         String identificativoSdI = this.busta.getProperty(SDICostanti.SDI_BUSTA_EXT_IDENTIFICATIVO_SDI);
  984.         if(identificativoSdI!=null) {
  985.             if(this.sdiValidazioneSemantica.sdiProperties.isEnable_fatturazionePassiva_notifiche_enrichInfoFromFattura()) {
  986.                 try{
  987.                     this.sdiValidazioneSemantica.validazioneUtils.readInformazioniFatturaRiferita(this.busta, identificativoSdI,
  988.                             SDICostantiServizioRicezioneFatture.RICEZIONE_SERVIZIO_RICEZIONE_FATTURE,
  989.                             SDICostantiServizioRicezioneFatture.RICEZIONE_SERVIZIO_RICEZIONE_FATTURE_AZIONE_RICEVI_FATTURE,
  990.                             false, SDICostanti.SDI_FATTURAZIONE_PASSIVA,
  991.                             (this.proprietaValidazioneSemantica!=null) ? this.proprietaValidazioneSemantica.getTracceState() : null);
  992.                 }catch(Exception e){
  993.                     this.sdiValidazioneSemantica.getLog().error("Traccia di una precedente fattura ricevuta, con identificativo SDI ["+identificativoSdI+"], non rilevata: "+e.getMessage(),e);
  994.                     this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
  995.                             validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  996.                                     "Traccia di una precedente fattura ricevuta, con identificativo SDI ["+identificativoSdI+"], non rilevata: "+e.getMessage(),e,
  997.                                     true)); // info: emetto solamente un errore di livello info
  998.                 }
  999.             }
  1000.         }
  1001.            
  1002.     }
  1003.    
  1004.     private void _validazioneDT(byte[] xmlDoc, SDIProperties sdiProperties,
  1005.             List<Eccezione> eccezioniValidazione, SDIValidazioneUtils validazioneUtils, IProtocolFactory<?> protocolFactory) throws Exception{
  1006.    
  1007.         boolean forceEccezioneLivelloInfo = false;
  1008.         if(sdiProperties.isEnableAccessoMessaggi() == false) {
  1009.             return;
  1010.         }
  1011.         else if(sdiProperties.isEnableAccessoMessaggiWarningMode()) {
  1012.             forceEccezioneLivelloInfo = true;
  1013.         }
  1014.        
  1015.         String tipoXml = "Notifica di Decorrenza Termini";
  1016.         byte[] xml = xmlDoc;
  1017.         if(sdiProperties.isEnableValidazioneMessaggiCompatibilitaNamespaceSenzaGov()){
  1018.             xml = SDICompatibilitaNamespaceErrati.convertiXmlNamespaceSenzaGov(protocolFactory.getLogger(), xml);
  1019.         }
  1020.        
  1021.         // validazione XSD file
  1022.         if(sdiProperties.isEnableValidazioneXsdMessaggi()){
  1023.             try{
  1024.                 AbstractValidatoreXSD validatore =
  1025.                         it.gov.fatturapa.sdi.messaggi.v1_0.utils.XSDValidatorWithSignature.getOpenSPCoop2MessageXSDValidator(protocolFactory.getLogger());
  1026.                 validatore.valida(new ByteArrayInputStream(xml));
  1027.             }catch(Exception e){
  1028.                 eccezioniValidazione.add(
  1029.                         validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  1030.                                 "Elemento ["+SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_FILE+"] contiene un file "+tipoXml+" non valido rispetto allo schema XSD: "+
  1031.                                         e.getMessage(),e, forceEccezioneLivelloInfo));
  1032.                 return; // esco anche in caso di forceEccezioneLivelloInfo poiche' i messaggi non sono ben formati e non ha senso andare avanti
  1033.             }
  1034.         }
  1035.        
  1036.         // Lettura metadati
  1037.         NotificaDecorrenzaTerminiType xmlObject = null;
  1038.         try{
  1039.             it.gov.fatturapa.sdi.messaggi.v1_0.utils.serializer.JaxbDeserializer deserializer =
  1040.                     new it.gov.fatturapa.sdi.messaggi.v1_0.utils.serializer.JaxbDeserializer();
  1041.             xmlObject = deserializer.readNotificaDecorrenzaTerminiType(xml);
  1042.             if(sdiProperties.isSaveMessaggiInContext()){
  1043.                 this.msg.addContextProperty(SDICostanti.SDI_MESSAGE_CONTEXT_MESSAGGIO_SERVIZIO_SDI, xmlObject);
  1044.             }
  1045.         }catch(Exception e){
  1046.             eccezioniValidazione.add(
  1047.                     validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
  1048.                             "Elemento ["+SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_FILE+"] contiene un file "+tipoXml+" non valido: "+
  1049.                                     e.getMessage(),e, forceEccezioneLivelloInfo));
  1050.             return;  // esco anche in caso di forceEccezioneLivelloInfo poiche' i messaggi non sono ben formati e non ha senso andare avanti
  1051.         }
  1052.        
  1053.         // IdentificativoSdI
  1054.         if(xmlObject.getIdentificativoSdI()!=null){
  1055.             this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_IDENTIFICATIVO_SDI_FATTURA, xmlObject.getIdentificativoSdI()+"");
  1056.         }
  1057.        
  1058.         // RiferimentoFattura
  1059.         if(xmlObject.getRiferimentoFattura()!=null){
  1060.             if(xmlObject.getRiferimentoFattura().getAnnoFattura()!=null){
  1061.                 this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_RIFERIMENTO_FATTURA_ANNO, xmlObject.getRiferimentoFattura().getAnnoFattura()+"");
  1062.             }
  1063.             if(xmlObject.getRiferimentoFattura().getNumeroFattura()!=null){
  1064.                 this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_RIFERIMENTO_FATTURA_NUMERO, xmlObject.getRiferimentoFattura().getNumeroFattura()+"");
  1065.             }
  1066.             if(xmlObject.getRiferimentoFattura().getPosizioneFattura()!=null){
  1067.                 this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_RIFERIMENTO_FATTURA_POSIZIONE, xmlObject.getRiferimentoFattura().getPosizioneFattura()+"");
  1068.             }
  1069.         }
  1070.        
  1071.         // NomeFile
  1072.         if(xmlObject.getNomeFile()!=null){
  1073.             this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_NOME_FILE_IN_NOTIFICA, xmlObject.getNomeFile());
  1074.         }
  1075.                
  1076.         // Descrizione
  1077.         if(xmlObject.getDescrizione()!=null){
  1078.             this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_DESCRIZIONE, xmlObject.getDescrizione());
  1079.         }
  1080.        
  1081.         // MessageId
  1082.         if(xmlObject.getMessageId()!=null){
  1083.             this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_MESSAGE_ID, xmlObject.getMessageId());
  1084.         }
  1085.        
  1086.         // Note
  1087.         if(xmlObject.getNote()!=null){
  1088.             this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_NOTE, xmlObject.getNote());
  1089.         }
  1090.        
  1091.     }
  1092. }