SDIValidatoreServizioRicezioneFatture.java
- /*
- * GovWay - A customizable API Gateway
- * https://govway.org
- *
- * Copyright (c) 2005-2025 Link.it srl (https://link.it).
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3, as published by
- * the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
- package org.openspcoop2.protocol.sdi.validator;
- import java.io.ByteArrayInputStream;
- import java.util.Iterator;
- import java.util.List;
- import javax.xml.namespace.QName;
- import javax.xml.soap.AttachmentPart;
- import javax.xml.soap.SOAPElement;
- import org.openspcoop2.message.OpenSPCoop2Message;
- import org.openspcoop2.message.OpenSPCoop2MessageFactory;
- import org.openspcoop2.message.soap.SoapUtils;
- import org.openspcoop2.message.soap.mtom.MTOMUtilities;
- import org.openspcoop2.protocol.sdi.config.SDIProperties;
- import org.openspcoop2.protocol.sdi.constants.SDICostanti;
- import org.openspcoop2.protocol.sdi.constants.SDICostantiServizioRicezioneFatture;
- import org.openspcoop2.protocol.sdi.utils.P7MInfo;
- import org.openspcoop2.protocol.sdi.utils.SDICompatibilitaNamespaceErrati;
- import org.openspcoop2.protocol.sdi.utils.SDIFatturaUtils;
- import org.openspcoop2.protocol.sdk.Busta;
- import org.openspcoop2.protocol.sdk.Eccezione;
- import org.openspcoop2.protocol.sdk.IProtocolFactory;
- import org.openspcoop2.protocol.sdk.constants.CodiceErroreCooperazione;
- import org.openspcoop2.protocol.sdk.validator.ProprietaValidazione;
- import org.openspcoop2.utils.Utilities;
- import org.openspcoop2.utils.io.Base64Utilities;
- import org.openspcoop2.utils.xml.AbstractValidatoreXSD;
- import org.w3c.dom.Document;
- import org.w3c.dom.Element;
- import it.gov.agenziaentrate.ivaservizi.docs.xsd.fattura.messaggi.v1_0.FileMetadatiType;
- import it.gov.fatturapa.sdi.messaggi.v1_0.MetadatiInvioFileType;
- import it.gov.fatturapa.sdi.messaggi.v1_0.NotificaDecorrenzaTerminiType;
- import it.gov.fatturapa.sdi.messaggi.v1_0.constants.TipiMessaggi;
- import it.gov.fatturapa.sdi.ws.ricezione.v1_0.types.utils.ProjectInfo;
- /**
- * SDIValidatoreServizioRicezioneFatture
- *
- * @author Andrea Poli (apoli@link.it)
- * @author $Author$
- * @version $Rev$, $Date$
- */
- public class SDIValidatoreServizioRicezioneFatture {
- private SDIValidazioneSintattica sdiValidazioneSintattica;
- private SDIValidazioneSemantica sdiValidazioneSemantica;
- private ProprietaValidazione proprietaValidazioneSemantica;
- private OpenSPCoop2Message msg;
- private OpenSPCoop2MessageFactory messageFactory;
- private boolean isRichiesta;
- private SOAPElement sdiMessage;
- private String namespace;
- private Busta busta;
-
-
- public SDIValidatoreServizioRicezioneFatture(SDIValidazioneSintattica sdiValidazioneSintattica,
- OpenSPCoop2Message msg,boolean isRichiesta,
- SOAPElement sdiMessage,Busta busta){
- this.sdiValidazioneSintattica = sdiValidazioneSintattica;
- this.msg = msg;
- this.messageFactory = this.msg!=null ? this.msg.getFactory() : OpenSPCoop2MessageFactory.getDefaultMessageFactory();
- this.isRichiesta = isRichiesta;
- this.sdiMessage = sdiMessage;
- this.namespace = ProjectInfo.getInstance().getProjectNamespace();
- this.busta = busta;
- }
- public SDIValidatoreServizioRicezioneFatture(SDIValidazioneSemantica sdiValidazioneSemantica, ProprietaValidazione proprietaValidazione,
- OpenSPCoop2Message msg,boolean isRichiesta,
- SOAPElement sdiMessage,Busta busta){
- this.sdiValidazioneSemantica = sdiValidazioneSemantica;
- this.proprietaValidazioneSemantica = proprietaValidazione;
- this.msg = msg;
- this.messageFactory = this.msg!=null ? this.msg.getFactory() : OpenSPCoop2MessageFactory.getDefaultMessageFactory();
- this.isRichiesta = isRichiesta;
- this.sdiMessage = sdiMessage;
- this.namespace = SDICostantiServizioRicezioneFatture.RICEZIONE_SERVIZIO_RICEZIONE_FATTURE_NAMESPACE;
- this.busta = busta;
- }
-
- private boolean checkServiceNamespace() throws Exception{
- if(this.namespace.equals(this.sdiMessage.getNamespaceURI())==false){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Namespace ["+this.sdiMessage.getNamespaceURI()+"] differente da quello atteso ["+this.namespace+"]"));
- return false;
- }
- return true;
- }
-
-
-
- /* ***** validaRiceviFatture ***** */
-
- public void validaRiceviFatture() throws Exception{
-
- if(checkServiceNamespace()==false){
- return;
- }
-
- if(this.sdiValidazioneSintattica!=null){
- if(this.isRichiesta){
- this._validazioneSintattica_RiceviFatture_richiesta();
- }
- else{
- throw new Exception("NotImplemented"); // l'engine non dovrebbe richiedere questo caso.
- }
- }
- else{
- if(this.isRichiesta){
- this._validazioneSemantica_RiceviFatture_richiesta();
- }
- else{
- throw new Exception("NotImplemented"); // l'engine non dovrebbe richiedere questo caso.
- }
- }
-
- }
- private void _validazioneSintattica_RiceviFatture_richiesta() throws Exception{
-
- if(SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ROOT_ELEMENT.equals(this.sdiMessage.getLocalName())==false){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "LocalName ["+this.sdiMessage.getLocalName()+"] differente da quello atteso ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ROOT_ELEMENT+"]"));
- return;
- }
-
- List<SOAPElement> elementChilds = SoapUtils.getNotEmptyChildSOAPElement(this.sdiMessage);
- if(elementChilds==null || elementChilds.size()<=0){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "RootElement [{"+this.namespace+"}"+this.sdiMessage.getLocalName()+"] non contiene elementi"));
- return;
- }
-
- String identificativoSdI = null;
- String nomeFile = null;
- Boolean fileRead = null;
- String nomeFileMetadati = null;
- Boolean metadatiRead = null;
- for (int i = 0; i < elementChilds.size(); i++) {
- SOAPElement child = elementChilds.get(i);
-
- if(SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_IDENTIFICATIVO_SDI.equals(child.getLocalName())){
- if(identificativoSdI!=null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_PRESENTE_PIU_VOLTE));
- return;
- }
- if(child.getTextContent()==null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_VALORIZZATO));
- return;
- }
- identificativoSdI = child.getTextContent();
- }
- else if(SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_NOME_FILE.equals(child.getLocalName())){
- if(nomeFile!=null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_NOME_FILE+"] presente piu' volte"));
- return;
- }
- if(child.getTextContent()==null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_NOME_FILE+"] non valorizzato"));
- return;
- }
- nomeFile = child.getTextContent();
- }
- else if(SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE.equals(child.getLocalName())){
- if(fileRead!=null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE+"] presente piu' volte"));
- return;
- }
- // Il contenuto viene gestito nella validazione semantica (poiche' deve essere applicata la sicurezza per la firma)
- fileRead = true;
- }
- else if(SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_NOME_FILE_METADATI.equals(child.getLocalName())){
- if(nomeFileMetadati!=null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_NOME_FILE_METADATI+"] presente piu' volte"));
- return;
- }
- if(child.getTextContent()==null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_NOME_FILE_METADATI+"] non valorizzato"));
- return;
- }
- nomeFileMetadati = child.getTextContent();
- }
- else if(SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_METADATI.equals(child.getLocalName())){
- if(metadatiRead!=null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_METADATI+"] presente piu' volte"));
- return;
- }
- // Il contenuto viene gestito nella validazione semantica (poiche' deve essere applicata la sicurezza per la firma)
- metadatiRead = true;
- }
- else{
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Element ["+child.getLocalName()+"] sconosciuto"));
- return;
- }
-
- if(child.getNamespaceURI()!=null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Element ["+child.getLocalName()+"] appartiene al namespace ("+child.getNamespaceURI()+"). Era atteso un elemento senza namespace"));
- return;
- }
- }
- if(identificativoSdI==null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_PRESENTE));
- return;
- }
- if(nomeFile==null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_NOME_FILE+"] non presente"));
- return;
- }
- if(fileRead==null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE+"] non presente"));
- return;
- }
- if(nomeFileMetadati==null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_NOME_FILE_METADATI+"] non presente"));
- return;
- }
- if(metadatiRead==null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_METADATI+"] non presente"));
- return;
- }
-
-
- // nomeFile
- try{
- SDIValidatoreNomeFile.validaNomeFileFattura(nomeFile, true);
- if(nomeFile.toLowerCase().endsWith(SDICostanti.SDI_FATTURA_ESTENSIONE_P7M)){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_FORMATO_ARCHIVIO_INVIO_FATTURA, SDICostanti.SDI_TIPO_FATTURA_P7M);
- }
- else{
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_FORMATO_ARCHIVIO_INVIO_FATTURA, SDICostanti.SDI_TIPO_FATTURA_XML);
- }
- }catch(Exception e){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_NOME_FILE+"] non valido: "+e.getMessage(),e,
- !this.sdiValidazioneSintattica.sdiProperties.isEnableValidazioneNomeFile()));
- if(this.sdiValidazioneSintattica.sdiProperties.isEnableValidazioneNomeFile()){
- return;
- }
- }
-
- // nomeFileMetadati
- try{
- SDIValidatoreNomeFile.validaNomeFileMessaggi(nomeFile, nomeFileMetadati, TipiMessaggi.MT);
- }catch(Exception e){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_NOME_FILE_METADATI+"] non valido: "+e.getMessage(),e,
- !this.sdiValidazioneSintattica.sdiProperties.isEnableValidazioneNomeFile()));
- if(this.sdiValidazioneSintattica.sdiProperties.isEnableValidazioneNomeFile()){
- return;
- }
- }
-
-
- // setto i valori sdi nella busta
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_IDENTIFICATIVO_SDI, identificativoSdI);
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_NOME_FILE, nomeFile);
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_NOME_FILE_METADATI, nomeFileMetadati);
-
- // NOTA: Il contenuto viene gestito nella validazione semantica (poiche' deve essere applicata la sicurezza per la firma)
- // // metadati
- // if(metadati!=null){
- // this._validazioneMetadati(metadati,this.sdiValidazioneSintattica.sdiProperties,this.sdiValidazioneSintattica.erroriValidazione,
- // this.sdiValidazioneSintattica.validazioneUtils,this.sdiValidazioneSintattica.getProtocolFactory());
- // }
- //
- // // fattura
- // if(file!=null){
- // this._validazioneFattura(file,this.sdiValidazioneSintattica.sdiProperties,this.sdiValidazioneSintattica.erroriValidazione,
- // this.sdiValidazioneSintattica.validazioneUtils,this.sdiValidazioneSintattica.getProtocolFactory());
- // }
-
-
- }
-
- private void _validazioneSemantica_RiceviFatture_richiesta() throws Exception{
-
- // NOTA: Il contenuto viene gestito nella validazione semantica (poiche' deve essere applicata la sicurezza per la firma)
- // Questo if sara' sempre vero
- if(this.busta.getProperty(SDICostanti.SDI_BUSTA_EXT_MESSAGE_ID)==null){
-
- /* **** METADATI **** */
-
- byte[] metadati = null;
- try{
- // la validazione sintattica garantisce la presenza
- QName qnameMetadati = new QName(SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_METADATI);
- Iterator<?> nodeMetadatiIt = this.sdiMessage.getChildElements(qnameMetadati);
- SOAPElement nodeMetadati = (SOAPElement) nodeMetadatiIt.next();
-
- Element xomReference = MTOMUtilities.getIfExistsXomReference(this.messageFactory, nodeMetadati);
- if(xomReference!=null){
- try{
- String cid = MTOMUtilities.getCidXomReference(xomReference);
- if(cid==null){
- throw new Exception("XomReference without cid reference");
- }
- AttachmentPart ap = MTOMUtilities.getAttachmentPart(this.msg, cid);
- metadati = Utilities.getAsByteArray(ap.getDataHandler().getInputStream());
- if(metadati==null || metadati.length<=0){
- throw new Exception("Contenuto non presente");
- }
- }catch(Exception e){
- this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE+"] non valorizzato correttamente: "+e.getMessage(),e));
- return;
- }
- }else{
- if(nodeMetadati.getTextContent()==null){
- this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_METADATI+"] non valorizzato"));
- return;
- }
- String base64Metadati = nodeMetadati.getTextContent();
- if(base64Metadati==null || "".equals(base64Metadati)){
- throw new Exception("Codifica Base64 non presente");
- }
- try{
- metadati = Base64Utilities.decode(base64Metadati);
- }catch(Exception e){
- // un errore non dovrebbe mai capitare, la validazione sintattica garantisce la presenza
- this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_METADATI+"] decodifica base64 non riuscita: "+e.getMessage(),e));
- return;
- }
- }
-
-
- }catch(Exception e){
- // un errore non dovrebbe mai capitare, la validazione sintattica garantisce la presenza
- this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_METADATI+"] non accessibile: "+e.getMessage(),e));
- return;
- }
- boolean validazioneMetadatiOk =
- this._validazioneMetadati(metadati,this.sdiValidazioneSemantica.sdiProperties,this.sdiValidazioneSemantica.erroriValidazione,
- this.sdiValidazioneSemantica.validazioneUtils,this.sdiValidazioneSemantica.getProtocolFactory());
- if(!validazioneMetadatiOk){
- return;
- }
-
- if(metadati!=null && this.sdiValidazioneSemantica.sdiProperties.isEnable_fatturazionePassiva_consegnaFileMetadati()) {
- this.msg.forceTransportHeader(SDICostanti.SDI_HEADER_FILE_METADATI, Base64Utilities.encodeAsString(metadati));
- }
-
-
- /* **** FATTURA **** */
-
- byte[] fattura = null;
- try{
- // la validazione sintattica garantisce la presenza
- QName qnameFattura = new QName(SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE);
- Iterator<?> nodeFatturaIt = this.sdiMessage.getChildElements(qnameFattura);
- SOAPElement nodeFattura = (SOAPElement) nodeFatturaIt.next();
-
- Element xomReference = MTOMUtilities.getIfExistsXomReference(this.messageFactory, nodeFattura);
- if(xomReference!=null){
- try{
- String cid = MTOMUtilities.getCidXomReference(xomReference);
- if(cid==null){
- throw new Exception("XomReference without cid reference");
- }
- AttachmentPart ap = MTOMUtilities.getAttachmentPart(this.msg, cid);
- fattura = Utilities.getAsByteArray(ap.getDataHandler().getInputStream());
- if(fattura==null || fattura.length<=0){
- throw new Exception("Contenuto non presente");
- }
- }catch(Exception e){
- this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE+"] non valorizzato correttamente: "+e.getMessage(),e));
- return;
- }
- }else{
- if(nodeFattura.getTextContent()==null){
- this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE+"] non valorizzato"));
- return;
- }
- String base64Fattura = nodeFattura.getTextContent();
- if(base64Fattura==null || "".equals(base64Fattura)){
- throw new Exception("Codifica Base64 non presente");
- }
- try{
- fattura = Base64Utilities.decode(base64Fattura);
- }catch(Exception e){
- this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE+"] decodifica base64 non riuscita: "+e.getMessage(),e));
- return;
- }
- }
-
- }catch(Exception e){
- // un errore non dovrebbe mai capitare, la validazione sintattica garantisce la presenza
- this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE+"] non accessibile: "+e.getMessage(),e));
- return;
- }
-
- // Il formato viene compreso durante la validazione sintattica
- Object formato = this.busta.getProperty(SDICostanti.SDI_BUSTA_EXT_FORMATO_ARCHIVIO_INVIO_FATTURA);
- byte [] tmpFatturaP7M = null;
- if(formato==null){
- // La validazione sintattica non ha compreso il formato della fattura, per via di errori sulla nomenclatura del file.
- // La validazione del nome file e' disabilitata se si arriva a questo punto.
- // Si prova a comprendere il tipo di formato esaminando direttamente la fattura
-
- // provo a vedere se e' XML (XaDEs)
- try{
- if(it.gov.fatturapa.sdi.fatturapa.v1_0.utils.XMLUtils.isFattura(fattura)){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_FORMATO_ARCHIVIO_INVIO_FATTURA, SDICostanti.SDI_TIPO_FATTURA_XML);
- formato = SDICostanti.SDI_TIPO_FATTURA_XML;
- }
- }catch(Throwable e){
- // ignore
- }
- if(formato==null){
- try{
- if(it.gov.fatturapa.sdi.fatturapa.v1_1.utils.XMLUtils.isFattura(fattura)){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_FORMATO_ARCHIVIO_INVIO_FATTURA, SDICostanti.SDI_TIPO_FATTURA_XML);
- formato = SDICostanti.SDI_TIPO_FATTURA_XML;
- }
- }catch(Throwable e){
- // ignore
- }
- }
- if(formato==null){
- try{
- if(it.gov.agenziaentrate.ivaservizi.docs.xsd.fatture.v1_2.utils.XMLUtils.isFattura(fattura)){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_FORMATO_ARCHIVIO_INVIO_FATTURA, SDICostanti.SDI_TIPO_FATTURA_XML);
- formato = SDICostanti.SDI_TIPO_FATTURA_XML;
- }
- }catch(Throwable e){
- // ignore
- }
- }
-
- // provo a vedere se e' un P7M (CaDES)
- if(formato==null){
- try{
- P7MInfo infoP7M = new P7MInfo(fattura, this.sdiValidazioneSemantica.getProtocolFactory().getLogger());
- tmpFatturaP7M = infoP7M.getXmlDecoded();
- if(tmpFatturaP7M!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_FORMATO_ARCHIVIO_INVIO_FATTURA, SDICostanti.SDI_TIPO_FATTURA_P7M);
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_FORMATO_ARCHIVIO_BASE64, infoP7M.isBase64Encoded()+"");
- formato = SDICostanti.SDI_TIPO_FATTURA_P7M;
- }
- }catch(Throwable e){
- // ignore
- }
- }
-
- if(formato==null){
- // formato non riconosciuto, non posso continuare ulteriormente
- this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE+"] decodifica non riuscita: formato non conosciuto"));
- return;
- }
- }
-
- // Se la fattura e' un P7M per poterla validare devo estrarne il contenuto.
- if(((String)formato).equals(SDICostanti.SDI_TIPO_FATTURA_P7M) &&
- (this.sdiValidazioneSemantica.sdiProperties.isEnableAccessoFattura() || this.sdiValidazioneSemantica.sdiProperties.isEnableValidazioneXsdFattura() ) ){
- if(tmpFatturaP7M==null){
- try{
- P7MInfo infoP7M = new P7MInfo(fattura, this.sdiValidazioneSemantica.getProtocolFactory().getLogger());
- fattura = infoP7M.getXmlDecoded();
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_FORMATO_ARCHIVIO_BASE64, infoP7M.isBase64Encoded()+"");
- }catch(Throwable e){
- this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE+"] decodifica p7m non riuscita: "+e.getMessage(),e));
- return;
- }
- }
- else{
- fattura = tmpFatturaP7M;
- }
- }
- SDIFatturaUtils.validazioneFattura(fattura,this.sdiValidazioneSemantica.sdiProperties,this.sdiValidazioneSemantica.erroriValidazione,
- this.sdiValidazioneSemantica.validazioneUtils,this.sdiValidazioneSemantica.getProtocolFactory(),
- this.busta,this.msg,true,true,false);
-
- // Posizione (Se abilitato lo split verra' re-impostato correttamente questo valore)
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_POSIZIONE_FATTURA_PA, 1+"");
-
- }
- }
-
- private boolean _validazioneMetadati(byte[] metadati, SDIProperties sdiProperties,
- List<Eccezione> eccezioniValidazione, SDIValidazioneUtils validazioneUtils, IProtocolFactory<?> protocolFactory) throws Exception{
-
- boolean forceEccezioneLivelloInfo = false;
- if(sdiProperties.isEnableAccessoMetadati() == false) {
- return true;
- }
- else if(sdiProperties.isEnableAccessoMetadatiWarningMode()) {
- forceEccezioneLivelloInfo = true;
- }
-
-
- boolean fatturaB2B = false;
- if(it.gov.agenziaentrate.ivaservizi.docs.xsd.fattura.messaggi.v1_0.utils.XMLUtils.isNotificaB2B(metadati)) {
- fatturaB2B = true;
- }
- else if(it.gov.fatturapa.sdi.messaggi.v1_0.utils.XMLUtils.isNotificaPA(metadati, sdiProperties.isEnableValidazioneMessaggiCompatibilitaNamespaceSenzaGov())) {
- fatturaB2B = false;
- }
- else {
- String namespace = null;
- Throwable eMalformato = null;
- try {
- org.openspcoop2.message.xml.MessageXMLUtils xmlUtils = org.openspcoop2.message.xml.MessageXMLUtils.getInstance(this.messageFactory);
- Document docXML = xmlUtils.newDocument(metadati);
- Element elemXML = docXML.getDocumentElement();
- namespace = elemXML.getNamespaceURI();
- }catch(Throwable t) {
- eMalformato = t;
- }
- if(namespace!=null) {
- eccezioniValidazione.add(
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_METADATI+"] contiene un namespace ("+namespace+") sconosciuto",
- forceEccezioneLivelloInfo));
- }
- else {
- eccezioniValidazione.add(
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_METADATI+"] contiene un xml malformato: "+eMalformato.getMessage(),eMalformato,
- forceEccezioneLivelloInfo));
- }
- return false; // esco anche in caso di forceEccezioneLivelloInfo poiche' i metadati non sono ben formati e non ha senso andare avanti
- }
-
-
- // validazione XSD file Metadati
- if(sdiProperties.isEnableValidazioneXsdMetadati()){
- try{
- if(fatturaB2B) {
- AbstractValidatoreXSD validatore =
- it.gov.agenziaentrate.ivaservizi.docs.xsd.fattura.messaggi.v1_0.utils.XSDValidatorWithSignature.getOpenSPCoop2MessageXSDValidator(protocolFactory.getLogger());
- validatore.valida(new ByteArrayInputStream(metadati));
- }
- else {
- AbstractValidatoreXSD validatore =
- it.gov.fatturapa.sdi.messaggi.v1_0.utils.XSDValidatorWithSignature.getOpenSPCoop2MessageXSDValidator(protocolFactory.getLogger());
- validatore.valida(new ByteArrayInputStream(metadati));
- }
- }catch(Exception e){
- eccezioniValidazione.add(
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_METADATI+"] contiene un file Metadati non valido rispetto allo schema XSD: "+
- e.getMessage(),e, forceEccezioneLivelloInfo));
- return false; // esco anche in caso di forceEccezioneLivelloInfo poiche' i metadati non sono ben formati e non ha senso andare avanti
- }
- }
-
- // Lettura metadati
-
- if(fatturaB2B) {
-
- FileMetadatiType metadatiObject = null;
- try{
- it.gov.agenziaentrate.ivaservizi.docs.xsd.fattura.messaggi.v1_0.utils.serializer.JaxbDeserializer deserializer =
- new it.gov.agenziaentrate.ivaservizi.docs.xsd.fattura.messaggi.v1_0.utils.serializer.JaxbDeserializer();
- metadatiObject = deserializer.readFileMetadatiType(metadati);
- if(sdiProperties.isSaveFatturaInContext()){
- this.msg.addContextProperty(SDICostanti.SDI_MESSAGE_CONTEXT_FATTURA_METADATI, metadatiObject);
- this.msg.addContextProperty(SDICostanti.SDI_MESSAGE_CONTEXT_FATTURA_METADATI_BYTES, metadati);
- }
- }catch(Exception e){
- eccezioniValidazione.add(
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_METADATI+"] contiene un file Metadati non valido: "+e.getMessage(),e,
- forceEccezioneLivelloInfo));
- return false; // esco anche in caso di forceEccezioneLivelloInfo poiche' i metadati non sono ben formati e non ha senso andare avanti
- }
-
- // Metadati.IdentificativoSdI
- String identificativoSdILettoInValidazioneSintattica = this.busta.getProperty(SDICostanti.SDI_BUSTA_EXT_IDENTIFICATIVO_SDI);
- if(identificativoSdILettoInValidazioneSintattica.equals(metadatiObject.getIdentificativoSdI().toString())==false){
- eccezioniValidazione.add(
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_VALIDO,
- "Identificativo presente nel messaggio SdI ["+identificativoSdILettoInValidazioneSintattica+
- "] differente da quello presente nel file Metadati ["+metadatiObject.getIdentificativoSdI().toString()+"]",
- !sdiProperties.isEnableValidazioneCampiInterniMetadati()));
- if(sdiProperties.isEnableValidazioneCampiInterniMetadati()){
- return false;
- }
- }
-
-
- // Metadati.NomeFile
- String nomeFileLettoInValidazioneSintattica = this.busta.getProperty(SDICostanti.SDI_BUSTA_EXT_NOME_FILE);
- if(nomeFileLettoInValidazioneSintattica.equals(metadatiObject.getNomeFile())==false){
- eccezioniValidazione.add(
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "NomeFile presente nel messaggio SdI ["+nomeFileLettoInValidazioneSintattica+
- "] differente da quello presente nel file Metadati ["+metadatiObject.getNomeFile()+"]",
- !sdiProperties.isEnableValidazioneCampiInterniMetadati()));
- if(sdiProperties.isEnableValidazioneCampiInterniMetadati()){
- return false;
- }
- }
-
- // Hash
- if(metadatiObject.getHash()!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_HASH_IN_NOTIFICA, metadatiObject.getHash());
- }
-
- // Metadati.CodiceDestinatario
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_CODICE_DESTINATARIO, metadatiObject.getCodiceDestinatario());
-
- // Metadati.FormatoFattura (validazione necessaria per riconoscere poi il tipo di fattura da parsare)
- String formatoFattura = metadatiObject.getFormato();
- if(!SDICostanti.SDI_VERSIONE_FATTURA_PA_10.equals(formatoFattura) &&
- !SDICostanti.SDI_VERSIONE_FATTURA_PA_11.equals(formatoFattura) &&
- !SDICostanti.SDI_VERSIONE_FATTURA_SEMPLIFICATA_10.equals(formatoFattura) &&
- !SDICostanti.SDI_VERSIONE_FATTURA_PA_12.equals(formatoFattura) &&
- !SDICostanti.SDI_VERSIONE_FATTURA_PR_12.equals(formatoFattura) ){
- eccezioniValidazione.add(
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "FormatoFattura presente nei metadati ["+formatoFattura+
- "] non valido"));
- return false;
- }
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_VERSIONE_FATTURA_PA, formatoFattura);
-
- // Metadati.TentativiInvio
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_TENTATIVI_INVIO, metadatiObject.getTentativiInvio().toString());
-
- // Metadati.MessageId
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_MESSAGE_ID, metadatiObject.getMessageId());
-
- // Metadati.Note
- if(metadatiObject.getNote()!=null)
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_NOTE, metadatiObject.getNote());
-
- }
- else {
-
- MetadatiInvioFileType metadatiObject = null;
- try{
- it.gov.fatturapa.sdi.messaggi.v1_0.utils.serializer.JaxbDeserializer deserializer =
- new it.gov.fatturapa.sdi.messaggi.v1_0.utils.serializer.JaxbDeserializer();
- metadatiObject = deserializer.readMetadatiInvioFileType(metadati);
- if(sdiProperties.isSaveFatturaInContext()){
- this.msg.addContextProperty(SDICostanti.SDI_MESSAGE_CONTEXT_FATTURA_METADATI, metadatiObject);
- this.msg.addContextProperty(SDICostanti.SDI_MESSAGE_CONTEXT_FATTURA_METADATI_BYTES, metadati);
- }
- }catch(Exception e){
- eccezioniValidazione.add(
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_METADATI+"] contiene un file Metadati non valido: "+
- e.getMessage(),e, forceEccezioneLivelloInfo));
- return false; // esco anche in caso di forceEccezioneLivelloInfo poiche' i metadati non sono ben formati e non ha senso andare avanti
- }
-
- // Metadati.IdentificativoSdI
- String identificativoSdILettoInValidazioneSintattica = this.busta.getProperty(SDICostanti.SDI_BUSTA_EXT_IDENTIFICATIVO_SDI);
- if(identificativoSdILettoInValidazioneSintattica.equals(metadatiObject.getIdentificativoSdI().toString())==false){
- eccezioniValidazione.add(
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_VALIDO,
- "Identificativo presente nel messaggio SdI ["+identificativoSdILettoInValidazioneSintattica+
- "] differente da quello presente nel file Metadati ["+metadatiObject.getIdentificativoSdI().toString()+"]",
- !sdiProperties.isEnableValidazioneCampiInterniMetadati()));
- if(sdiProperties.isEnableValidazioneCampiInterniMetadati()){
- return false;
- }
- }
-
-
- // Metadati.NomeFile
- String nomeFileLettoInValidazioneSintattica = this.busta.getProperty(SDICostanti.SDI_BUSTA_EXT_NOME_FILE);
- if(nomeFileLettoInValidazioneSintattica.equals(metadatiObject.getNomeFile())==false){
- eccezioniValidazione.add(
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "NomeFile presente nel messaggio SdI ["+nomeFileLettoInValidazioneSintattica+
- "] differente da quello presente nel file Metadati ["+metadatiObject.getNomeFile()+"]",
- !sdiProperties.isEnableValidazioneCampiInterniMetadati()));
- if(sdiProperties.isEnableValidazioneCampiInterniMetadati()){
- return false;
- }
- }
-
- // Metadati.CodiceDestinatario
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_CODICE_DESTINATARIO, metadatiObject.getCodiceDestinatario());
-
- // Metadati.FormatoFattura (validazione necessaria per riconoscere poi il tipo di fattura da parsare)
- String formatoFattura = metadatiObject.getFormato();
- if(!SDICostanti.SDI_VERSIONE_FATTURA_PA_10.equals(formatoFattura) &&
- !SDICostanti.SDI_VERSIONE_FATTURA_PA_11.equals(formatoFattura) &&
- !SDICostanti.SDI_VERSIONE_FATTURA_SEMPLIFICATA_10.equals(formatoFattura) &&
- !SDICostanti.SDI_VERSIONE_FATTURA_PA_12.equals(formatoFattura) &&
- !SDICostanti.SDI_VERSIONE_FATTURA_PR_12.equals(formatoFattura) ){
- eccezioniValidazione.add(
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "FormatoFattura presente nei metadati ["+formatoFattura+
- "] non valido"));
- return false;
- }
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_VERSIONE_FATTURA_PA, formatoFattura);
-
- // Metadati.TentativiInvio
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_TENTATIVI_INVIO, metadatiObject.getTentativiInvio().toString());
-
- // Metadati.MessageId
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_MESSAGE_ID, metadatiObject.getMessageId());
-
- // Metadati.Note
- if(metadatiObject.getNote()!=null)
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_NOTE, metadatiObject.getNote());
-
- }
-
- return true;
- }
-
-
-
-
-
-
-
-
- /* ***** validaNotificaDecorrenzaTermini ***** */
-
- public void validaNotificaDecorrenzaTermini() throws Exception{
-
- if(checkServiceNamespace()==false){
- return;
- }
-
- if(this.sdiValidazioneSintattica!=null){
- if(this.isRichiesta){
- this._validazioneSintattica_FileSdiType_richiesta(SDICostantiServizioRicezioneFatture.NOTIFICA_DECORRENZA_TERMINI_RICHIESTA_ROOT_ELEMENT,
- TipiMessaggi.DT);
- }
- else{
- throw new Exception("NotImplemented"); // l'engine non dovrebbe richiedere questo caso.
- }
- }
- else{
- if(this.isRichiesta){
- this._validazioneSemantica_FileSdiType_richiesta(TipiMessaggi.DT);
- }
- else{
- throw new Exception("NotImplemented"); // l'engine non dovrebbe richiedere questo caso.
- }
- }
-
- }
-
- private void _validazioneSintattica_FileSdiType_richiesta(String rootElement,TipiMessaggi tipoMessaggio) throws Exception{
-
- if(rootElement.equals(this.sdiMessage.getLocalName())==false){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "LocalName ["+this.sdiMessage.getLocalName()+"] differente da quello atteso ["+rootElement+"]"));
- return;
- }
-
- List<SOAPElement> elementChilds = SoapUtils.getNotEmptyChildSOAPElement(this.sdiMessage);
- if(elementChilds==null || elementChilds.size()<=0){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "RootElement [{"+this.namespace+"}"+this.sdiMessage.getLocalName()+"] non contiene elementi"));
- return;
- }
-
- String identificativoSdI = null;
- String nomeFile = null;
- Boolean fileRead = null;
- for (int i = 0; i < elementChilds.size(); i++) {
- SOAPElement child = elementChilds.get(i);
-
- if(SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_RICHIESTA_ELEMENT_IDENTIFICATIVO_SDI.equals(child.getLocalName())){
- if(identificativoSdI!=null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_PRESENTE_PIU_VOLTE));
- return;
- }
- if(child.getTextContent()==null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_VALORIZZATO));
- return;
- }
- identificativoSdI = child.getTextContent();
- }
- else if(SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_NOME_FILE.equals(child.getLocalName())){
- if(nomeFile!=null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_NOME_FILE+"] presente piu' volte"));
- return;
- }
- if(child.getTextContent()==null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_NOME_FILE+"] non valorizzato"));
- return;
- }
- nomeFile = child.getTextContent();
- }
- else if(SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_FILE.equals(child.getLocalName())){
- if(fileRead!=null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_FILE+"] presente piu' volte"));
- return;
- }
- // Il contenuto viene gestito nella validazione semantica (poiche' deve essere applicata la sicurezza per la firma)
- fileRead = true;
- }
- else{
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Element ["+child.getLocalName()+"] sconosciuto"));
- return;
- }
-
- if(child.getNamespaceURI()!=null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Element ["+child.getLocalName()+"] appartiene al namespace ("+child.getNamespaceURI()+"). Era atteso un elemento senza namespace"));
- return;
- }
- }
- if(identificativoSdI==null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_PRESENTE));
- return;
- }
- if(nomeFile==null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_NOME_FILE+"] non presente"));
- return;
- }
- if(fileRead==null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_FILE+"] non presente"));
- return;
- }
-
-
- // nomeFile
- try{
- SDIValidatoreNomeFile.validaNomeFileMessaggi(nomeFile, tipoMessaggio);
- }catch(Exception e){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_NOME_FILE+"] non valido: "+e.getMessage(),e,
- !this.sdiValidazioneSintattica.sdiProperties.isEnableValidazioneNomeFile()));
- if(this.sdiValidazioneSintattica.sdiProperties.isEnableValidazioneNomeFile()){
- return;
- }
- }
-
-
- // setto i valori sdi nella busta
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_IDENTIFICATIVO_SDI, identificativoSdI);
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_NOME_FILE, nomeFile);
-
- }
-
-
- private void _validazioneSemantica_FileSdiType_richiesta(TipiMessaggi tipoMessaggio) throws Exception{
-
-
- byte[] xml = null;
- try{
- // la validazione sintattica garantisce la presenza
- QName qnameFile = new QName(SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_FILE);
- Iterator<?> nodeFileIt = this.sdiMessage.getChildElements(qnameFile);
- SOAPElement nodeFile = (SOAPElement) nodeFileIt.next();
-
- Element xomReference = MTOMUtilities.getIfExistsXomReference(this.messageFactory, nodeFile);
- if(xomReference!=null){
- try{
- String cid = MTOMUtilities.getCidXomReference(xomReference);
- if(cid==null){
- throw new Exception("XomReference without cid reference");
- }
- AttachmentPart ap = MTOMUtilities.getAttachmentPart(this.msg, cid);
- xml = Utilities.getAsByteArray(ap.getDataHandler().getInputStream());
- if(xml==null || xml.length<=0){
- throw new Exception("Contenuto non presente");
- }
- }catch(Exception e){
- this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_FILE+"] non valorizzato correttamente: "+e.getMessage(),e));
- return;
- }
- }else{
- if(nodeFile.getTextContent()==null){
- this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_FILE+"] non valorizzato"));
- return;
- }
- String base64File = nodeFile.getTextContent();
- if(base64File==null || "".equals(base64File)){
- throw new Exception("Codifica Base64 non presente");
- }
- try{
- xml = Base64Utilities.decode(base64File);
- }catch(Exception e){
- // un errore non dovrebbe mai capitare, la validazione sintattica garantisce la presenza
- this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_FILE+"] decodifica base64 non riuscita: "+e.getMessage(),e));
- return;
- }
- }
-
-
- }catch(Exception e){
- // un errore non dovrebbe mai capitare, la validazione sintattica garantisce la presenza
- this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_FILE+"] non accessibile: "+e.getMessage(),e));
- return;
- }
-
-
- switch (tipoMessaggio) {
-
- case DT:
- this._validazioneDT(xml,this.sdiValidazioneSemantica.sdiProperties,this.sdiValidazioneSemantica.erroriValidazione,
- this.sdiValidazioneSemantica.validazioneUtils,this.sdiValidazioneSemantica.getProtocolFactory());
- break;
- default:
- break;
- }
-
- // Riporto nella notifica le informazioni della fattura precedentemente ricevuta
- String identificativoSdI = this.busta.getProperty(SDICostanti.SDI_BUSTA_EXT_IDENTIFICATIVO_SDI);
- if(identificativoSdI!=null) {
- if(this.sdiValidazioneSemantica.sdiProperties.isEnable_fatturazionePassiva_notifiche_enrichInfoFromFattura()) {
- try{
- this.sdiValidazioneSemantica.validazioneUtils.readInformazioniFatturaRiferita(this.busta, identificativoSdI,
- SDICostantiServizioRicezioneFatture.RICEZIONE_SERVIZIO_RICEZIONE_FATTURE,
- SDICostantiServizioRicezioneFatture.RICEZIONE_SERVIZIO_RICEZIONE_FATTURE_AZIONE_RICEVI_FATTURE,
- false, SDICostanti.SDI_FATTURAZIONE_PASSIVA,
- (this.proprietaValidazioneSemantica!=null) ? this.proprietaValidazioneSemantica.getTracceState() : null);
- }catch(Exception e){
- this.sdiValidazioneSemantica.getLog().error("Traccia di una precedente fattura ricevuta, con identificativo SDI ["+identificativoSdI+"], non rilevata: "+e.getMessage(),e);
- this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Traccia di una precedente fattura ricevuta, con identificativo SDI ["+identificativoSdI+"], non rilevata: "+e.getMessage(),e,
- true)); // info: emetto solamente un errore di livello info
- }
- }
- }
-
- }
-
- private void _validazioneDT(byte[] xmlDoc, SDIProperties sdiProperties,
- List<Eccezione> eccezioniValidazione, SDIValidazioneUtils validazioneUtils, IProtocolFactory<?> protocolFactory) throws Exception{
-
- boolean forceEccezioneLivelloInfo = false;
- if(sdiProperties.isEnableAccessoMessaggi() == false) {
- return;
- }
- else if(sdiProperties.isEnableAccessoMessaggiWarningMode()) {
- forceEccezioneLivelloInfo = true;
- }
-
- String tipoXml = "Notifica di Decorrenza Termini";
- byte[] xml = xmlDoc;
- if(sdiProperties.isEnableValidazioneMessaggiCompatibilitaNamespaceSenzaGov()){
- xml = SDICompatibilitaNamespaceErrati.convertiXmlNamespaceSenzaGov(protocolFactory.getLogger(), xml);
- }
-
- // validazione XSD file
- if(sdiProperties.isEnableValidazioneXsdMessaggi()){
- try{
- AbstractValidatoreXSD validatore =
- it.gov.fatturapa.sdi.messaggi.v1_0.utils.XSDValidatorWithSignature.getOpenSPCoop2MessageXSDValidator(protocolFactory.getLogger());
- validatore.valida(new ByteArrayInputStream(xml));
- }catch(Exception e){
- eccezioniValidazione.add(
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_FILE+"] contiene un file "+tipoXml+" non valido rispetto allo schema XSD: "+
- e.getMessage(),e, forceEccezioneLivelloInfo));
- return; // esco anche in caso di forceEccezioneLivelloInfo poiche' i messaggi non sono ben formati e non ha senso andare avanti
- }
- }
-
- // Lettura metadati
- NotificaDecorrenzaTerminiType xmlObject = null;
- try{
- it.gov.fatturapa.sdi.messaggi.v1_0.utils.serializer.JaxbDeserializer deserializer =
- new it.gov.fatturapa.sdi.messaggi.v1_0.utils.serializer.JaxbDeserializer();
- xmlObject = deserializer.readNotificaDecorrenzaTerminiType(xml);
- if(sdiProperties.isSaveMessaggiInContext()){
- this.msg.addContextProperty(SDICostanti.SDI_MESSAGE_CONTEXT_MESSAGGIO_SERVIZIO_SDI, xmlObject);
- }
- }catch(Exception e){
- eccezioniValidazione.add(
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRicezioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_FILE+"] contiene un file "+tipoXml+" non valido: "+
- e.getMessage(),e, forceEccezioneLivelloInfo));
- return; // esco anche in caso di forceEccezioneLivelloInfo poiche' i messaggi non sono ben formati e non ha senso andare avanti
- }
-
- // IdentificativoSdI
- if(xmlObject.getIdentificativoSdI()!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_IDENTIFICATIVO_SDI_FATTURA, xmlObject.getIdentificativoSdI()+"");
- }
-
- // RiferimentoFattura
- if(xmlObject.getRiferimentoFattura()!=null){
- if(xmlObject.getRiferimentoFattura().getAnnoFattura()!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_RIFERIMENTO_FATTURA_ANNO, xmlObject.getRiferimentoFattura().getAnnoFattura()+"");
- }
- if(xmlObject.getRiferimentoFattura().getNumeroFattura()!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_RIFERIMENTO_FATTURA_NUMERO, xmlObject.getRiferimentoFattura().getNumeroFattura()+"");
- }
- if(xmlObject.getRiferimentoFattura().getPosizioneFattura()!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_RIFERIMENTO_FATTURA_POSIZIONE, xmlObject.getRiferimentoFattura().getPosizioneFattura()+"");
- }
- }
-
- // NomeFile
- if(xmlObject.getNomeFile()!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_NOME_FILE_IN_NOTIFICA, xmlObject.getNomeFile());
- }
-
- // Descrizione
- if(xmlObject.getDescrizione()!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_DESCRIZIONE, xmlObject.getDescrizione());
- }
-
- // MessageId
- if(xmlObject.getMessageId()!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_MESSAGE_ID, xmlObject.getMessageId());
- }
-
- // Note
- if(xmlObject.getNote()!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_NOTE, xmlObject.getNote());
- }
-
- }
- }