SDIValidatoreServizioRiceviNotifica.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.SDICostantiServizioRiceviNotifica;
- import org.openspcoop2.protocol.sdi.utils.SDICompatibilitaNamespaceErrati;
- 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.utils.Utilities;
- import org.openspcoop2.utils.io.Base64Utilities;
- import org.openspcoop2.utils.xml.AbstractValidatoreXSD;
- import org.w3c.dom.Element;
- import it.gov.fatturapa.sdi.messaggi.v1_0.NotificaEsitoCommittenteType;
- import it.gov.fatturapa.sdi.messaggi.v1_0.ScartoEsitoCommittenteType;
- import it.gov.fatturapa.sdi.messaggi.v1_0.constants.TipiMessaggi;
- import it.gov.fatturapa.sdi.ws.ricezione.v1_0.types.constants.EsitoNotificaType;
- import it.gov.fatturapa.sdi.ws.ricezione.v1_0.types.utils.ProjectInfo;
- /**
- * SDIValidatoreServizioRiceviNotifica
- *
- * @author Andrea Poli (apoli@link.it)
- * @author $Author$
- * @version $Rev$, $Date$
- */
- public class SDIValidatoreServizioRiceviNotifica {
- private SDIValidazioneSintattica sdiValidazioneSintattica;
- private SDIValidazioneSemantica sdiValidazioneSemantica;
- private OpenSPCoop2Message msg;
- private OpenSPCoop2MessageFactory messageFactory;
- private boolean isRichiesta;
- private SOAPElement sdiMessage;
- private String namespace;
- private Busta busta;
-
-
- public SDIValidatoreServizioRiceviNotifica(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 SDIValidatoreServizioRiceviNotifica(SDIValidazioneSemantica sdiValidazioneSemantica,
- OpenSPCoop2Message msg,boolean isRichiesta,
- SOAPElement sdiMessage,Busta busta){
- this.sdiValidazioneSemantica = sdiValidazioneSemantica;
- this.msg = msg;
- this.messageFactory = this.msg!=null ? this.msg.getFactory() : OpenSPCoop2MessageFactory.getDefaultMessageFactory();
- this.isRichiesta = isRichiesta;
- this.sdiMessage = sdiMessage;
- this.namespace = SDICostantiServizioRiceviNotifica.SDI_SERVIZIO_RICEVI_NOTIFICA_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;
- }
-
-
-
- /* ***** validaNotificaEsito ***** */
-
- public void validaNotificaEsito() throws Exception{
-
- if(checkServiceNamespace()==false){
- return;
- }
-
- if(this.sdiValidazioneSintattica!=null){
- if(this.isRichiesta){
- this._validazioneSintattica_NotificaEsito_richiesta();
- }
- else{
- this._validazioneSintattica_NotificaEsito_risposta();
- }
- }
- else{
- if(this.isRichiesta){
- this._validazioneSemantica_NotificaEsito_richiesta();
- }
- else{
- this._validazioneSemantica_NotificaEsito_risposta();
- }
- }
-
- }
- private void _validazioneSintattica_NotificaEsito_richiesta() throws Exception{
-
- if(SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_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 ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_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;
- for (int i = 0; i < elementChilds.size(); i++) {
- SOAPElement child = elementChilds.get(i);
-
- if(SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_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(SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RICHIESTA_ELEMENT_NOME_FILE.equals(child.getLocalName())){
- if(nomeFile!=null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_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 ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RICHIESTA_ELEMENT_NOME_FILE+"] non valorizzato"));
- return;
- }
- nomeFile = child.getTextContent();
- }
- else if(SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RICHIESTA_ELEMENT_FILE.equals(child.getLocalName())){
- if(fileRead!=null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_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 ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RICHIESTA_ELEMENT_NOME_FILE+"] non presente"));
- return;
- }
- if(fileRead==null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RICHIESTA_ELEMENT_FILE+"] non presente"));
- return;
- }
-
- // nomeFile
- try{
- SDIValidatoreNomeFile.validaNomeFileMessaggi(nomeFile, TipiMessaggi.EC);
- }catch(Exception e){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_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_NotificaEsito_richiesta() throws Exception{
-
- // NOTA: Il contenuto viene gestito nella validazione semantica (poiche' deve essere applicata la sicurezza per la firma)
-
- /* **** ESITO COMMITTENTE **** */
-
- byte[] esito = null;
- try{
- // la validazione sintattica garantisce la presenza
- QName qnameEsito = new QName(SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RICHIESTA_ELEMENT_FILE);
- Iterator<?> nodeEsitoIt = this.sdiMessage.getChildElements(qnameEsito);
- SOAPElement nodeEsito = (SOAPElement) nodeEsitoIt.next();
-
- Element xomReference = MTOMUtilities.getIfExistsXomReference(this.messageFactory, nodeEsito);
- 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);
- esito = Utilities.getAsByteArray(ap.getDataHandler().getInputStream());
- if(esito==null || esito.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 ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RICHIESTA_ELEMENT_FILE+"] non valorizzato correttamente: "+e.getMessage(),e));
- return;
- }
- }else{
- if(nodeEsito.getTextContent()==null){
- this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RICHIESTA_ELEMENT_FILE+"] non valorizzato"));
- return;
- }
- String base64Metadati = nodeEsito.getTextContent();
- if(base64Metadati==null || "".equals(base64Metadati)){
- throw new Exception("Codifica Base64 non presente");
- }
- try{
- esito = 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 ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_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 ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RICHIESTA_ELEMENT_FILE+"] non accessibile: "+e.getMessage(),e));
- return;
- }
- this._validazioneEsito(esito,this.sdiValidazioneSemantica.sdiProperties,this.sdiValidazioneSemantica.erroriValidazione,
- this.sdiValidazioneSemantica.validazioneUtils,this.sdiValidazioneSemantica.getProtocolFactory());
-
- }
-
- private void _validazioneEsito(byte[] esitoDoc, 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;
- }
-
- byte[] esito = esitoDoc;
- if(sdiProperties.isEnableValidazioneMessaggiCompatibilitaNamespaceSenzaGov()){
- esito = SDICompatibilitaNamespaceErrati.convertiXmlNamespaceSenzaGov(protocolFactory.getLogger(), esito);
- }
-
- // 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(esito));
- }catch(Exception e){
- eccezioniValidazione.add(
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RICHIESTA_ELEMENT_FILE+"] contiene un file Notifica di Esito Committente 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
- NotificaEsitoCommittenteType esitoObject = null;
- try{
- it.gov.fatturapa.sdi.messaggi.v1_0.utils.serializer.JaxbDeserializer deserializer =
- new it.gov.fatturapa.sdi.messaggi.v1_0.utils.serializer.JaxbDeserializer();
- esitoObject = deserializer.readNotificaEsitoCommittenteType(esito);
- }catch(Exception e){
- eccezioniValidazione.add(
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RICHIESTA_ELEMENT_FILE+"] contiene un file Notifica di Esito Committente 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
- }
-
- // Esito.IdentificativoSdI
- if(esitoObject.getIdentificativoSdI()!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_IDENTIFICATIVO_SDI, esitoObject.getIdentificativoSdI().toString());
- }
-
- // Esito.RiferimentoFattura
- if(esitoObject.getRiferimentoFattura()!=null){
- if(esitoObject.getRiferimentoFattura().getAnnoFattura()!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_RIFERIMENTO_FATTURA_ANNO, esitoObject.getRiferimentoFattura().getAnnoFattura().toString());
- }
- if(esitoObject.getRiferimentoFattura().getNumeroFattura()!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_RIFERIMENTO_FATTURA_NUMERO, esitoObject.getRiferimentoFattura().getNumeroFattura());
- }
- if(esitoObject.getRiferimentoFattura().getPosizioneFattura()!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_RIFERIMENTO_FATTURA_POSIZIONE, esitoObject.getRiferimentoFattura().getPosizioneFattura().toString());
- }
- }
-
- // Esito.Esito
- if(esitoObject.getEsito()!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_ESITO, esitoObject.getEsito().name());
- }
-
- // Esito.Descrizione
- if(esitoObject.getDescrizione()!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_DESCRIZIONE, esitoObject.getDescrizione());
- }
-
- // Esito.MessageId
- if(esitoObject.getMessageIdCommittente()!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_MESSAGE_ID_COMMITTENTE, esitoObject.getMessageIdCommittente());
- }
-
- }
-
-
-
-
- private void _validazioneSintattica_NotificaEsito_risposta() throws Exception{
-
- if(SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_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 ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_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 esito = null;
- Boolean scartoElementRead = null;
- String nomeFileScartoEsito = null;
- Boolean scartoEsitoRead = null;
- for (int i = 0; i < elementChilds.size(); i++) {
- SOAPElement child = elementChilds.get(i);
-
- if(SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_ESITO.equals(child.getLocalName())){
- if(esito!=null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_ESITO+"] presente piu' volte"));
- return;
- }
- if(child.getTextContent()==null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_ESITO+"] non valorizzato"));
- return;
- }
- esito = child.getTextContent();
- }
- else if(SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_SCARTO_ESITO.equals(child.getLocalName())){
- if(scartoElementRead!=null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_SCARTO_ESITO+"] presente piu' volte"));
- return;
- }
- scartoElementRead = true;
-
- List<SOAPElement> elementScartoChilds = SoapUtils.getNotEmptyChildSOAPElement(child);
- if(elementScartoChilds==null || elementScartoChilds.size()<=0){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_SCARTO_ESITO+"] non contiene elementi"));
- return;
- }
- for (int j = 0; j < elementScartoChilds.size(); j++) {
- SOAPElement scartoChild = elementScartoChilds.get(j);
-
- if(SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_SCARTO_ESITO_NOME_FILE.equals(scartoChild.getLocalName())){
- if(nomeFileScartoEsito!=null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_SCARTO_ESITO_NOME_FILE+"] presente piu' volte"));
- return;
- }
- if(scartoChild.getTextContent()==null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_SCARTO_ESITO_NOME_FILE+"] non valorizzato"));
- return;
- }
- nomeFileScartoEsito = scartoChild.getTextContent();
- }
- else if(SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_SCARTO_ESITO_FILE.equals(scartoChild.getLocalName())){
- if(scartoEsitoRead!=null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_SCARTO_ESITO_FILE+"] presente piu' volte"));
- return;
- }
- // Il contenuto viene gestito nella validazione semantica (poiche' deve essere applicata la sicurezza per la firma)
- scartoEsitoRead = 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;
- }
- }
-
- // esito
- if(esito==null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_ESITO+"] non presente"));
- return;
- }
- try{
- if(!EsitoNotificaType.ES00.name().equals(esito) &&
- !EsitoNotificaType.ES01.name().equals(esito) &&
- !EsitoNotificaType.ES02.name().equals(esito) ){
- throw new Exception("Valore ["+esito+"] differente dai valori attesi: ["+EsitoNotificaType.ES00.name()+","+EsitoNotificaType.ES01.name()+","+EsitoNotificaType.ES02.name()+"]");
- }
- }catch(Exception e){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_ESITO+"] non valido: "+e.getMessage(),e));
- return;
- }
-
- // scartoEsito (presente solo se ES00 = NOTIFICA NON ACCETTATA)
- if(EsitoNotificaType.ES00.name().equals(esito)){
- if(scartoEsitoRead==null){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_SCARTO_ESITO+"] non presente (richiesto dallo stato "+EsitoNotificaType.ES00.name()+")"));
- return;
- }
-
- // nomeFile
- try{
- SDIValidatoreNomeFile.validaNomeFileMessaggi(nomeFileScartoEsito, TipiMessaggi.SE);
- }catch(Exception e){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_SCARTO_ESITO_NOME_FILE+"] non valido: "+e.getMessage(),e,
- !this.sdiValidazioneSintattica.sdiProperties.isEnableValidazioneNomeFile()));
- if(this.sdiValidazioneSintattica.sdiProperties.isEnableValidazioneNomeFile()){
- return;
- }
- }
-
- }
-
- // ES02 = SERVIZIO NON DISPONIBILE
- else if(EsitoNotificaType.ES02.name().equals(esito)){
- this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_SCARTO_ESITO+"] indica un ES02 - Sistema non Disponibile del SdI"));
- return;
- }
-
- // setto i valori sdi nella busta
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_ESITO_NOTIFICA, esito);
-
-
- }
-
- private void _validazioneSemantica_NotificaEsito_risposta() throws Exception{
-
- // NOTA: Il contenuto viene gestito nella validazione semantica (poiche' deve essere applicata la sicurezza per la firma)
-
- /* **** SCARTO ESITO COMMITTENTE **** */
-
- byte[] scartoEsito = null;
- try{
- // la validazione sintattica garantisce la presenza se richiesta
- QName qnameEsito = new QName(SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_SCARTO_ESITO);
- Iterator<?> nodeEsitoIt = this.sdiMessage.getChildElements(qnameEsito);
- SOAPElement nodeEsito = null;
- if(nodeEsitoIt!=null){
- Object o = null;
- try{
- o = nodeEsitoIt.next();
- }catch(Exception e){
- // ignore
- }
- if(o!=null){
- nodeEsito = (SOAPElement) o;
- }
- }
-
- if(nodeEsito!=null){
- QName qnameEsitoFile = new QName(SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_SCARTO_ESITO_FILE);
- Iterator<?> nodeEsitoFileIt = nodeEsito.getChildElements(qnameEsitoFile);
- SOAPElement nodeEsitoFile = null;
- if(nodeEsitoFileIt!=null){
- Object o = null;
- try{
- o = nodeEsitoFileIt.next();
- }catch(Exception e){
- // ignore
- }
- if(o!=null){
- nodeEsitoFile = (SOAPElement) o;
- }
- }
-
- if(nodeEsitoFile!=null){
- Element xomReference = MTOMUtilities.getIfExistsXomReference(this.messageFactory, nodeEsitoFile);
- 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);
- scartoEsito = Utilities.getAsByteArray(ap.getDataHandler().getInputStream());
- if(scartoEsito==null || scartoEsito.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 ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_SCARTO_ESITO_FILE+"] non valorizzato correttamente: "+e.getMessage(),e));
- return;
- }
- }else{
- if(nodeEsitoFile.getTextContent()==null){
- this.sdiValidazioneSemantica.erroriValidazione.add(this.sdiValidazioneSemantica.
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_SCARTO_ESITO_FILE+"] non valorizzato"));
- return;
- }
- String base64Metadati = nodeEsitoFile.getTextContent();
- if(base64Metadati==null || "".equals(base64Metadati)){
- throw new Exception("Codifica Base64 non presente");
- }
- try{
- scartoEsito = 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 ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_SCARTO_ESITO_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 ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_SCARTO_ESITO_FILE+"] non accessibile: "+e.getMessage(),e));
- return;
- }
- if(scartoEsito!=null){
- this._validazioneScartoEsito(scartoEsito,this.sdiValidazioneSemantica.sdiProperties,this.sdiValidazioneSemantica.erroriValidazione,
- this.sdiValidazioneSemantica.validazioneUtils,this.sdiValidazioneSemantica.getProtocolFactory());
- }
-
-
- }
-
- private void _validazioneScartoEsito(byte[] esitoDoc, 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;
- }
-
- byte[] esito = esitoDoc;
- if(sdiProperties.isEnableValidazioneMessaggiCompatibilitaNamespaceSenzaGov()){
- esito = SDICompatibilitaNamespaceErrati.convertiXmlNamespaceSenzaGov(protocolFactory.getLogger(), esito);
- }
-
- // 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(esito));
- }catch(Exception e){
- eccezioniValidazione.add(
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_SCARTO_ESITO+"] contiene un file Notifica di Scarto Esito Committente 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
- ScartoEsitoCommittenteType scartoEsitoObject = null;
- try{
- it.gov.fatturapa.sdi.messaggi.v1_0.utils.serializer.JaxbDeserializer deserializer =
- new it.gov.fatturapa.sdi.messaggi.v1_0.utils.serializer.JaxbDeserializer();
- scartoEsitoObject = deserializer.readScartoEsitoCommittenteType(esito);
- if(sdiProperties.isSaveMessaggiInContext()){
- this.msg.addContextProperty(SDICostanti.SDI_MESSAGE_CONTEXT_MESSAGGIO_SERVIZIO_SDI, scartoEsitoObject);
- }
- }catch(Exception e){
- eccezioniValidazione.add(
- validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
- "Elemento ["+SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_SCARTO_ESITO+"] contiene un file Notifica di Scarto Esito Committente 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
- }
-
- // Esito.IdentificativoSdI
- if(scartoEsitoObject.getIdentificativoSdI()!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_IDENTIFICATIVO_SDI, scartoEsitoObject.getIdentificativoSdI().toString());
- }
-
- // Esito.RiferimentoFattura
- if(scartoEsitoObject.getRiferimentoFattura()!=null){
- if(scartoEsitoObject.getRiferimentoFattura().getAnnoFattura()!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_RIFERIMENTO_FATTURA_ANNO, scartoEsitoObject.getRiferimentoFattura().getAnnoFattura().toString());
- }
- if(scartoEsitoObject.getRiferimentoFattura().getNumeroFattura()!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_RIFERIMENTO_FATTURA_NUMERO, scartoEsitoObject.getRiferimentoFattura().getNumeroFattura());
- }
- if(scartoEsitoObject.getRiferimentoFattura().getPosizioneFattura()!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_RIFERIMENTO_FATTURA_POSIZIONE, scartoEsitoObject.getRiferimentoFattura().getPosizioneFattura().toString());
- }
- }
-
- // Esito.Scarto
- if(scartoEsitoObject.getScarto()!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_SCARTO, scartoEsitoObject.getScarto().name());
- }
-
- // Esito.MessageId
- if(scartoEsitoObject.getMessageId()!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_MESSAGE_ID, scartoEsitoObject.getMessageId());
- }
- if(scartoEsitoObject.getMessageIdCommittente()!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_MESSAGE_ID_COMMITTENTE, scartoEsitoObject.getMessageIdCommittente());
- }
-
- // Esito.Note
- if(scartoEsitoObject.getNote()!=null){
- this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_NOTE, scartoEsitoObject.getNote());
- }
-
- }
-
- }