SDIValidatoreServizioRiceviFile.java

/*
 * GovWay - A customizable API Gateway 
 * https://govway.org
 * 
 * Copyright (c) 2005-2024 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 it.gov.fatturapa.sdi.ws.trasmissione.v1_0.types.constants.ErroreInvioType;
import it.gov.fatturapa.sdi.ws.trasmissione.v1_0.types.utils.ProjectInfo;

import java.util.List;

import javax.xml.soap.SOAPElement;

import org.openspcoop2.message.OpenSPCoop2Message;
import org.openspcoop2.message.soap.SoapUtils;
import org.openspcoop2.protocol.sdi.constants.SDICostanti;
import org.openspcoop2.protocol.sdi.constants.SDICostantiServizioRiceviFile;
import org.openspcoop2.protocol.sdk.Busta;
import org.openspcoop2.protocol.sdk.constants.CodiceErroreCooperazione;

/**
 * SDIValidatoreServizioRiceviFile
 * 
 * @author Andrea Poli (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class SDIValidatoreServizioRiceviFile {

	private SDIValidazioneSintattica sdiValidazioneSintattica;
	@SuppressWarnings("unused")
	private SDIValidazioneSemantica sdiValidazioneSemantica;
	@SuppressWarnings("unused")
	private OpenSPCoop2Message msg;
	private boolean isRichiesta;
	private SOAPElement sdiMessage;
	private String namespace;
	private Busta busta;
	
	public SDIValidatoreServizioRiceviFile(SDIValidazioneSintattica sdiValidazioneSintattica,
			OpenSPCoop2Message msg,boolean isRichiesta,
			SOAPElement sdiMessage,Busta busta){
		this.sdiValidazioneSintattica = sdiValidazioneSintattica;
		this.msg = msg;
		this.isRichiesta = isRichiesta;
		this.sdiMessage = sdiMessage;
		this.namespace = ProjectInfo.getInstance().getProjectNamespace();
		this.busta = busta;
	}
	public SDIValidatoreServizioRiceviFile(SDIValidazioneSemantica sdiValidazioneSemantica,
			OpenSPCoop2Message msg,boolean isRichiesta,
			SOAPElement sdiMessage,Busta busta){
		this.sdiValidazioneSemantica = sdiValidazioneSemantica;
		this.msg = msg;
		this.isRichiesta = isRichiesta;
		this.sdiMessage = sdiMessage;
		this.namespace = ProjectInfo.getInstance().getProjectNamespace();
		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;
	}
	
	
	
	
	/* ***** validaRiceviFile ***** */
	
	public void validaRiceviFile() throws Exception{
		
		if(checkServiceNamespace()==false){
			return;
		}
		
		if(this.sdiValidazioneSintattica!=null){
			if(this.isRichiesta){
				throw new Exception("NotImplemented"); // l'engine non dovrebbe richiedere questo caso.
			}
			else{
				this._validazioneSintattica_RiceviFile_risposta();
			}
		}
		else{
			if(this.isRichiesta){
				throw new Exception("NotImplemented"); // l'engine non dovrebbe richiedere questo caso.
			}
			else{
				// non vi sono contenuti xml da validare
			}
		}
	}
	
	private void _validazioneSintattica_RiceviFile_risposta() throws Exception{
		
		if(SDICostantiServizioRiceviFile.RICEVI_FILE_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 ["+SDICostantiServizioRiceviFile.RICEVI_FILE_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 identificativoSdI = null;
		String data = null;
		StringBuilder erroreSB = new StringBuilder();
		for (int i = 0; i < elementChilds.size(); i++) {
			SOAPElement child = elementChilds.get(i);
	
			if(SDICostantiServizioRiceviFile.RICEVI_FILE_RISPOSTA_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(SDICostantiServizioRiceviFile.RICEVI_FILE_RISPOSTA_ELEMENT_DATA_ORA_RICEZIONE.equals(child.getLocalName())){
				if(data!=null){
					this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
							validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
							"Elemento ["+SDICostantiServizioRiceviFile.RICEVI_FILE_RISPOSTA_ELEMENT_DATA_ORA_RICEZIONE+"] presente piu' volte"));
					return;	
				}
				if(child.getTextContent()==null){
					this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
							validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
							"Elemento ["+SDICostantiServizioRiceviFile.RICEVI_FILE_RISPOSTA_ELEMENT_DATA_ORA_RICEZIONE+"] non valorizzato"));
					return;	
				}
				data = child.getTextContent();
			}
			else if(SDICostantiServizioRiceviFile.RICEVI_FILE_RISPOSTA_ELEMENT_ERRORE.equals(child.getLocalName())){
				if(erroreSB!=null && erroreSB.length()>0){
					this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
							validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
							"Elemento ["+SDICostantiServizioRiceviFile.RICEVI_FILE_RISPOSTA_ELEMENT_ERRORE+"] presente piu' volte"));
					return;	
				}
				if(child.getTextContent()==null){
					this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
							validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
							"Elemento ["+SDICostantiServizioRiceviFile.RICEVI_FILE_RISPOSTA_ELEMENT_ERRORE+"] non valorizzato"));
					return;	
				}
				String errore = child.getTextContent();
				if(errore!=null) {
					erroreSB.append(errore);
				}
			}
			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;	
			}
		}
		
		// identificativoSDI
		if(identificativoSdI==null){
			this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
					validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_PRESENTE));
			return;	
		}
		
		// data
		if(data==null){
			this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
					validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
							"Elemento ["+SDICostantiServizioRiceviFile.RICEVI_FILE_RISPOSTA_ELEMENT_DATA_ORA_RICEZIONE+"] non presente"));
			return;	
		}
		
		// errore
		String errore = (erroreSB.length()>0) ? erroreSB.toString() : null;
		if(errore!=null){
			try{
				if(!ErroreInvioType.EI01.name().equals(errore) && 
						!ErroreInvioType.EI02.name().equals(errore) && 
						!ErroreInvioType.EI03.name().equals(errore) ){
					throw new Exception("Valore ["+errore+"] differente dai valori attesi: ["+ErroreInvioType.EI01.name()+","+ErroreInvioType.EI02.name()+","+ErroreInvioType.EI03.name()+"]");
				}
			}catch(Exception e){
				this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
						validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
								"Elemento ["+SDICostantiServizioRiceviFile.RICEVI_FILE_RISPOSTA_ELEMENT_ERRORE+"] non valido: "+e.getMessage(),e));
				return;	
			}
			
			String motivo = null;
			if(ErroreInvioType.EI01.name().equals(errore)){
				motivo = "EI01 - FILE VUOTO";
			}
			else if(ErroreInvioType.EI02.name().equals(errore)){
				motivo = "EI02 - SERVIZIO NON DISPONIBILE";
			}
			else if(ErroreInvioType.EI03.name().equals(errore)){
				motivo = "EI03 - UTENTE NON ABILITATO";
			}
			this.sdiValidazioneSintattica.erroriValidazione.add(this.sdiValidazioneSintattica.
					validazioneUtils.newEccezioneValidazione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO,
							"Elemento ["+SDICostantiServizioRiceviFile.RICEVI_FILE_RISPOSTA_ELEMENT_ERRORE+"] indica uno stato del SdI in errore: "+motivo));
		}
				
		// setto i valori sdi nella busta
		this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_IDENTIFICATIVO_SDI, identificativoSdI);
		this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_DATA_ORA_RICEZIONE, data);
		if(errore!=null){
			this.busta.addProperty(SDICostanti.SDI_BUSTA_EXT_ERRORE, errore);
		}
		
		
	}

}