SPCoopValidazioneSintattica.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.spcoop.validator;


import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import javax.xml.soap.AttachmentPart;
import javax.xml.soap.Detail;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPFault;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPHeaderElement;

import org.openspcoop2.core.constants.TipoPdD;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.message.OpenSPCoop2Message;
import org.openspcoop2.message.OpenSPCoop2MessageFactory;
import org.openspcoop2.message.OpenSPCoop2SoapMessage;
import org.openspcoop2.message.constants.Costanti;
import org.openspcoop2.message.constants.MessageRole;
import org.openspcoop2.message.constants.MessageType;
import org.openspcoop2.message.soap.SoapUtils;
import org.openspcoop2.protocol.basic.BasicStateComponentFactory;
import org.openspcoop2.protocol.sdk.Busta;
import org.openspcoop2.protocol.sdk.Context;
import org.openspcoop2.protocol.sdk.Eccezione;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.sdk.Riscontro;
import org.openspcoop2.protocol.sdk.Trasmissione;
import org.openspcoop2.protocol.sdk.builder.ProprietaManifestAttachments;
import org.openspcoop2.protocol.sdk.config.ITraduttore;
import org.openspcoop2.protocol.sdk.constants.CodiceErroreCooperazione;
import org.openspcoop2.protocol.sdk.constants.ContestoCodificaEccezione;
import org.openspcoop2.protocol.sdk.constants.CostantiProtocollo;
import org.openspcoop2.protocol.sdk.constants.ErroreCooperazione;
import org.openspcoop2.protocol.sdk.constants.Inoltro;
import org.openspcoop2.protocol.sdk.constants.LivelloRilevanza;
import org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione;
import org.openspcoop2.protocol.sdk.constants.RuoloMessaggio;
import org.openspcoop2.protocol.sdk.constants.TipoOraRegistrazione;
import org.openspcoop2.protocol.sdk.state.IState;
import org.openspcoop2.protocol.sdk.validator.IValidazioneSintattica;
import org.openspcoop2.protocol.sdk.validator.ProprietaValidazioneErrori;
import org.openspcoop2.protocol.sdk.validator.StrutturaBustaException;
import org.openspcoop2.protocol.sdk.validator.ValidazioneSintatticaResult;
import org.openspcoop2.protocol.spcoop.SPCoopBustaRawContent;
import org.openspcoop2.protocol.spcoop.config.SPCoopProperties;
import org.openspcoop2.protocol.spcoop.constants.SPCoopCostanti;
import org.openspcoop2.protocol.spcoop.constants.SPCoopCostantiPosizioneEccezione;
import org.openspcoop2.protocol.spcoop.utils.SPCoopUtils;
import org.openspcoop2.utils.date.DateManager;
import org.openspcoop2.utils.date.DateUtils;
import org.w3c.dom.Node;

/**
 * Classe che implementa, in base al protocollo SPCoop, l'interfaccia {@link org.openspcoop2.protocol.sdk.validator.IValidazioneSintattica}
 *
 * @author Poli Andrea (apoli@link.it)
 * @author Lorenzo Nardi (nardi@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class SPCoopValidazioneSintattica extends BasicStateComponentFactory implements IValidazioneSintattica<SOAPHeaderElement>{

	/** Messaggio. */
	private OpenSPCoop2SoapMessage msg;
	public void setMsg(OpenSPCoop2SoapMessage msg) {
		this.msg = msg;
	}
	/** HeaderSOAP */
	private SOAPHeader headerSOAP = null;
	/** Header SPCoop */
	private SPCoopBustaRawContent headerEGov;
	public void setHeaderSOAP(SOAPHeader headerSOAP) {
		this.headerSOAP = headerSOAP;
	}
	/** Errori di validazione riscontrati sulla busta */
	private java.util.List<Eccezione> erroriValidazione;
	/** Errori di processamento riscontrati sulla busta */
	private java.util.List<Eccezione> erroriProcessamento;
	/** Errors riscontrati sulla lista eccezioni */
	private java.util.List<Eccezione> errorsTrovatiSullaListaEccezioni;
	/** Busta */
	private Busta busta;
	/** Eventuale messaggio di errore avvenuto durante il processo di validazione */
	private String msgErrore;
	/** Eventuale codice di errore avvenuto durante il processo di validazione  */
	private CodiceErroreCooperazione codiceErrore;
	/** Indicazione se leggere gli attributi qualificati */
	private boolean readQualifiedAttribute;
	public void setReadQualifiedAttribute(boolean readQualifiedAttribute) {
		this.readQualifiedAttribute = readQualifiedAttribute;
	}

	private boolean segnalazioneElementoPresentePiuVolte = false;
	
	/** Indicazione se la busta risulta scaduta */
	private boolean messaggioScaduto = false;
	
	/** bustaErroreHeaderIntestazione: generata solo quando la busta egov arrivata non contiene gli elementi principali */
	private Busta bustaErroreHeaderIntestazione = null;
	
//	private List<String> tipiSoggetti = null;
//	private List<String> tipiServizi = null;

	private ITraduttore traduttore = null;
	
	private SPCoopProperties spcoopProperties = null;
	
	@SuppressWarnings("unused")
	private Context context;
	
	/**
	 * Costruttore
	 *
	 * @param protocolFactory ProtocolFactory
	 * @throws ProtocolException 
	 * 
	 */
	public SPCoopValidazioneSintattica(IProtocolFactory<SOAPHeaderElement> protocolFactory,IState state) throws ProtocolException{
		super(protocolFactory,state);
		this.errorsTrovatiSullaListaEccezioni = new java.util.ArrayList<Eccezione>();
		this.erroriProcessamento = new java.util.ArrayList<Eccezione>();
		this.erroriValidazione = new java.util.ArrayList<Eccezione>();
		
//		this.tipiSoggetti = this.protocolFactory.createProtocolConfiguration().getTipiSoggetti();
//		this.tipiServizi = this.protocolFactory.createProtocolConfiguration().getTipiServizi(ServiceBinding.SOAP);
		
		this.traduttore = this.protocolFactory.createTraduttore();
		
		this.spcoopProperties = SPCoopProperties.getInstance(this.log);
	}


	public SPCoopBustaRawContent getHeaderEGov(OpenSPCoop2SoapMessage aMsg, boolean readQualifiedAttribute) throws ProtocolException{
		this.msg = aMsg;
		this.readQualifiedAttribute = readQualifiedAttribute;
		return getHeaderEGov();
	}
	/**
	 * Ritorna l'header SPCoop.
	 *
	 * @return header SPCoop.
	 * 
	 */
	public SPCoopBustaRawContent getHeaderEGov() throws ProtocolException{
		try{
			if(this.headerEGov!=null){
				return this.headerEGov;
			}else{
				if(this.headerSOAP==null){
					this.headerSOAP = this.msg.getSOAPHeader();
				}
				this.headerEGov = this.getHeaderEGov(this.msg.getFactory(), this.headerSOAP);
				return this.headerEGov;
			}
		}catch(Exception e){
			this.log.error("ValidazioneSintattica.headerEGovAsBytes error: "+e.getMessage(),e);
			throw new ProtocolException("ValidazioneSintattica.headerEGovAsBytes error: "+e.getMessage(),e);
		}
	}


	@Override
	public void setContext(Context context) {
		this.context = context;
	}

	/**
	 * Oggetto Busta SPCoop contenente i valori della busta ricevuta.
	 *
	 * @return busta SPCoop.
	 * 
	 */
	public Busta getBusta(){
		return this.busta;
	}

	/**
	 * Ritorna un List contenente eventuali eccezioni di validazione riscontrate nella busta SPCoop.   
	 *
	 * @return Eccezioni riscontrate nella busta SPCoop.
	 * 
	 */
	public java.util.List<Eccezione> getEccezioniValidazione(){
		return this.erroriValidazione;
	}
	/**
	 * Ritorna un List contenente eventuali eccezioni di processamento riscontrate nella busta SPCoop.   
	 *
	 * @return Eccezioni riscontrate nella busta SPCoop.
	 * 
	 */
	public java.util.List<Eccezione> getEccezioniProcessamento(){
		return this.erroriProcessamento;
	}

	/**
	 * Ritorna un List contenente eventuali eccezioni riscontrate nella busta SPCoop durante il processo di validazione.   
	 *
	 * @return Eccezioni riscontrate nella busta SPCoop.
	 * 
	 */
	public java.util.List<Eccezione> getErroriTrovatiSullaListaEccezioni(){
		return this.errorsTrovatiSullaListaEccezioni;
	}

	/**
	 * In caso di avvenuto errore durante il processo di validazione, 
	 * questo metodo ritorna il motivo dell'errore.
	 *
	 * @return motivo dell'errore (se avvenuto).
	 * 
	 */
	public String getMsgErrore(){
		return this.msgErrore;
	}

	/**
	 * In caso di avvenuto errore, questo metodo ritorna il codice dell'errore.
	 *
	 * @return codice dell'errore (se avvenuto).
	 * 
	 */
	public CodiceErroreCooperazione getCodiceErrore(){
		return this.codiceErrore;
	}

	/**
	 * Ritorna l'header SPCoop.
	 *
	 * @return header SPCoop.
	 * 
	 */
	public SPCoopBustaRawContent getHeaderSPCoop(){
		return this.headerEGov;
	}

	/**
	 * Metodo che effettua una validazione sintattica di una busta SPCoop. 
	 * Il metodo, oltre ad effettuare la validazione della busta, si occupa anche di leggerne il contenuto e 
	 * di impostarlo all'interno dell'oggetto <var>busta</var>.
	 * Mano mano che sono incontrati errori di validazione, viene creato un oggetto 
	 *   {@link Eccezione}, e viene inserito nel List <var>errors</var>.
	 *
	 * @return return true in caso di validazione sintattica riuscita (con o senza anomalie), false in caso di errori di processamento.
	 * 
	 */
	public boolean valida(boolean localizzaSolamenteDatiIdentificativiMinimi){

		OpenSPCoop2MessageFactory messageFactory = null;
		try{

			/** ------ CONTROLLO PRESENZA BUSTA SPCOOP ----- */

			// Estraggo header
			if(this.headerSOAP==null)
				this.headerSOAP = this.msg.getSOAPHeader();
			if(this.headerSOAP==null){
				this.msgErrore =  "Analizzato un messaggio senza header";
				this.codiceErrore = CodiceErroreCooperazione.FORMATO_INTESTAZIONE_NON_CORRETTO;
				return false;
			}
			
			messageFactory = this.msg.getFactory();
			
			// Estraggo busta SPCoop
			if(this.headerEGov==null)
				this.headerEGov = getHeaderEGov(messageFactory, this.headerSOAP);
			if(this.headerEGov==null){
				this.msgErrore =  "Analizzato un messaggio senza busta SPCoop";
				this.codiceErrore = CodiceErroreCooperazione.FORMATO_INTESTAZIONE_NON_CORRETTO;
				return false;
			}	    
			
		} catch(StrutturaBustaException e) {
			this.log.error("Struttura della busta non corretta: "+e.getMessage(),e);
			this.msgErrore =  e.getMessage();
			this.codiceErrore = CodiceErroreCooperazione.FORMATO_INTESTAZIONE_NON_CORRETTO;
			return false; 
		} catch(Exception e) {
			this.msgErrore = "(Validazione sintattica) "+e.getMessage();
			this.codiceErrore = CodiceErroreCooperazione.FORMATO_INTESTAZIONE_NON_CORRETTO;
			this.busta = null;
			return false;
		}


		try{

			/** ------ VALIDAZIONE SINTATTICA -- */

			// Busta da ritornare
			Busta aBusta = new Busta(this.protocolFactory.getProtocol());
			this.busta = aBusta;
			this.erroriValidazione = new java.util.ArrayList<Eccezione>();
			this.erroriProcessamento = new java.util.ArrayList<Eccezione>();
			this.errorsTrovatiSullaListaEccezioni = new java.util.ArrayList<Eccezione>();

			// Prefix eGov
			String xmlns = getPrefix();

			// Controllo Actor
			//log.info("Controllo attributo Actor["+this.header.getActor()+"] ...");
			if(SPCoopCostanti.ACTOR_EGOV.equals(this.headerEGov.getElement().getActor()) == false){
				if(this.spcoopProperties.isGenerazioneBustaErrore_actorScorretto()==false){
					throw new StrutturaBustaException("Header egov con actor scorretto","Actor");
				}else{
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.FORMATO_INTESTAZIONE_NON_CORRETTO);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_FORMATO_INTESTAZIONE_NON_CORRETTO_POSIZIONE_ACTOR.toString());
					this.erroriValidazione.add(ecc);
				}
			}
			
			// Controllo MustUnderstand
			//log.info("Controllo attributo MustUnderstand["+this.header.getMustUnderstand()+"] ...");
			if(this.headerEGov.getElement().getMustUnderstand() == false){ 
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				ecc.setCodiceEccezione(CodiceErroreCooperazione.FORMATO_INTESTAZIONE_NON_CORRETTO);
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_FORMATO_INTESTAZIONE_NON_CORRETTO_POSIZIONE_MUST_UNDERSTAND.toString());
				this.erroriValidazione.add(ecc);
			}
			List<Node> list = SoapUtils.getNotEmptyChildNodes(messageFactory, this.headerEGov.getElement());

			//	Controllo value prefix
			if(SPCoopCostanti.NAMESPACE_EGOV.equals(this.headerEGov.getElement().getNamespaceURI())==false){
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				ecc.setCodiceEccezione(CodiceErroreCooperazione.FORMATO_INTESTAZIONE_NON_CORRETTO);
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_FORMATO_INTESTAZIONE_NON_CORRETTO_POSIZIONE_NAMESPACE.toString());
				this.erroriValidazione.add(ecc);
			}

			// intestazione messaggio
			Node intestazioneMsg = list.get(0);
			List<Node> headerMsg = SoapUtils.getNotEmptyChildNodes(messageFactory, intestazioneMsg);
			boolean mittenteGiaTrovato = false;
			boolean destinatarioGiaTrovato = false;
			boolean profiloCollaborazioneGiaTrovato = false;
			boolean collaborazioneGiaTrovato = false;
			boolean servizioGiaTrovato = false;
			boolean azioneGiaTrovato = false;
			boolean messaggioGiaTrovato = false;
			boolean profiloTrasmissioneGiaTrovato = false;
			boolean sequenzaGiaTrovato = false;
			for(int i =0; i<headerMsg.size();i++){
				Node child = headerMsg.get(i);
				//if((child.getNodeName().equals(xmlns+"Mittente"))){
				if(SoapUtils.matchLocalName(messageFactory, child, "Mittente", xmlns, SPCoopCostanti.NAMESPACE_EGOV)){
					if(mittenteGiaTrovato==false){
						validazioneMittente(messageFactory, child,xmlns);
						mittenteGiaTrovato = true;
					}else{
						if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
							throw new StrutturaBustaException("Header egov con più di un elemento Mittente","Mittente");
						}else{
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.MITTENTE_PRESENTE_PIU_VOLTE);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							if(this.segnalazioneElementoPresentePiuVolte)
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MITTENTE_SCONOSCIUTO_POSIZIONE+" "+CostantiProtocollo.ECCEZIONE_ELEMENTO_PRESENTE_PIU_VOLTE);
							else
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MITTENTE_SCONOSCIUTO_POSIZIONE.toString());
							this.erroriValidazione.add(ecc);
						}
					}
				}
				//else if((child.getNodeName().equals(xmlns+"Destinatario"))){
				else if(SoapUtils.matchLocalName(messageFactory, child, "Destinatario", xmlns, SPCoopCostanti.NAMESPACE_EGOV)){
					if(destinatarioGiaTrovato==false){
						validazioneDestinatario(messageFactory, child,xmlns);
						destinatarioGiaTrovato = true;
					}else{
						if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
							throw new StrutturaBustaException("Header egov con più di un elemento Destinatario","Destinatario");
						}else{
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.DESTINATARIO_PRESENTE_PIU_VOLTE);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							if(this.segnalazioneElementoPresentePiuVolte)
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_DESTINATARIO_SCONOSCIUTO_POSIZIONE+" "+CostantiProtocollo.ECCEZIONE_ELEMENTO_PRESENTE_PIU_VOLTE);
							else
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_DESTINATARIO_SCONOSCIUTO_POSIZIONE.toString());
							this.erroriValidazione.add(ecc);
						}
					}
				}
				//else if((child.getNodeName().equals(xmlns+"ProfiloCollaborazione"))){
				else if(SoapUtils.matchLocalName(messageFactory, child, "ProfiloCollaborazione", xmlns, SPCoopCostanti.NAMESPACE_EGOV)){
					// Serve per poter riconoscere il caso del profilo asincrono in modo da non localizzare una porta applicativa
					//if(localizzaSolamenteDatiIdentificativiMinimi==false){
					if(profiloCollaborazioneGiaTrovato==false){
						validazioneProfiloCollaborazione(messageFactory, child,xmlns);
						profiloCollaborazioneGiaTrovato = true;
					}else{
						if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
							throw new StrutturaBustaException("Header egov con più di un elemento ProfiloCollaborazione","ProfiloCollaborazione");
						}else{
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.PROFILO_COLLABORAZIONE_PRESENTE_PIU_VOLTE);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							if(this.segnalazioneElementoPresentePiuVolte)
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_COLLABORAZIONE_SCONOSCIUTO_POSIZIONE+" "+CostantiProtocollo.ECCEZIONE_ELEMENTO_PRESENTE_PIU_VOLTE);
							else
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_COLLABORAZIONE_SCONOSCIUTO_POSIZIONE.toString());
							this.erroriValidazione.add(ecc);
						}
					}
				}
				//else if((child.getNodeName().equals(xmlns+"Collaborazione"))){
				else if(SoapUtils.matchLocalName(messageFactory, child, "Collaborazione", xmlns, SPCoopCostanti.NAMESPACE_EGOV)){
					if(localizzaSolamenteDatiIdentificativiMinimi==false){
						if(collaborazioneGiaTrovato==false){
							validazioneCollaborazione(messageFactory, child);
							collaborazioneGiaTrovato = true;
						}else{
							if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
								throw new StrutturaBustaException("Header egov con più di un elemento Collaborazione","Collaborazione");
							}else{
								Eccezione ecc = new Eccezione();
								ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
								ecc.setCodiceEccezione(CodiceErroreCooperazione.COLLABORAZIONE_PRESENTE_PIU_VOLTE);
								ecc.setRilevanza(LivelloRilevanza.ERROR);
								if(this.segnalazioneElementoPresentePiuVolte)
									ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_COLLABORAZIONE_SCONOSCIUTA_POSIZIONE+" "+CostantiProtocollo.ECCEZIONE_ELEMENTO_PRESENTE_PIU_VOLTE);
								else
									ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_COLLABORAZIONE_SCONOSCIUTA_POSIZIONE.toString());
								this.erroriValidazione.add(ecc);
							}
						}
					}
				}
				//else if((child.getNodeName().equals(xmlns+"Servizio"))){
				else if(SoapUtils.matchLocalName(messageFactory, child, "Servizio", xmlns, SPCoopCostanti.NAMESPACE_EGOV)){
					if(servizioGiaTrovato==false){
						validazioneServizio(messageFactory, child,xmlns);
						servizioGiaTrovato = true;
					}else{
						if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
							throw new StrutturaBustaException("Header egov con più di un elemento Servizio","Servizio");
						}else{
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.SERVIZIO_PRESENTE_PIU_VOLTE);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							if(this.segnalazioneElementoPresentePiuVolte)
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_SERVIZIO_SCONOSCIUTO_POSIZIONE+" "+CostantiProtocollo.ECCEZIONE_ELEMENTO_PRESENTE_PIU_VOLTE);
							else
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_SERVIZIO_SCONOSCIUTO_POSIZIONE.toString());
							this.erroriValidazione.add(ecc);
						}
					}
				}
				//else if((child.getNodeName().equals(xmlns+"Azione"))){
				else if(SoapUtils.matchLocalName(messageFactory, child, "Azione", xmlns, SPCoopCostanti.NAMESPACE_EGOV)){
					if(azioneGiaTrovato==false){
						validazioneAzione(messageFactory, child);
						azioneGiaTrovato = true;
					}else{
						if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
							throw new StrutturaBustaException("Header egov con più di un elemento Azione","Azione");
						}else{
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.AZIONE_PRESENTE_PIU_VOLTE);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							if(this.segnalazioneElementoPresentePiuVolte)
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_AZIONE_SCONOSCIUTA_POSIZIONE+" "+CostantiProtocollo.ECCEZIONE_ELEMENTO_PRESENTE_PIU_VOLTE);
							else
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_AZIONE_SCONOSCIUTA_POSIZIONE.toString());
							this.erroriValidazione.add(ecc);
						}
					}
				}
				//else if((child.getNodeName().equals(xmlns+"Messaggio"))){
				else if(SoapUtils.matchLocalName(messageFactory, child, "Messaggio", xmlns, SPCoopCostanti.NAMESPACE_EGOV)){
					// Serve per poter riconoscere il caso del profilo asincrono in modo da non localizzare una porta applicativa
					//if(localizzaSolamenteDatiIdentificativiMinimi==false){
					if(messaggioGiaTrovato==false){
						validazioneMessaggio(messageFactory, child,xmlns);
						messaggioGiaTrovato = true;
					}else{
						if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
							throw new StrutturaBustaException("Header egov con più di un elemento Messaggio","Messaggio");
						}else{
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.FORMATO_INTESTAZIONE_NON_CORRETTO);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							if(this.segnalazioneElementoPresentePiuVolte)
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_FORMATO_INTESTAZIONE_NON_CORRETTO_POSIZIONE_MESSAGGIO+" "+CostantiProtocollo.ECCEZIONE_ELEMENTO_PRESENTE_PIU_VOLTE);
							else
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_FORMATO_INTESTAZIONE_NON_CORRETTO_POSIZIONE_MESSAGGIO.toString());
							this.erroriValidazione.add(ecc);
						}
					}
					//}
				}
				//else if((child.getNodeName().equals(xmlns+"ProfiloTrasmissione"))){
				else if(SoapUtils.matchLocalName(messageFactory, child, "ProfiloTrasmissione", xmlns, SPCoopCostanti.NAMESPACE_EGOV)){
					if(localizzaSolamenteDatiIdentificativiMinimi==false){
						if(profiloTrasmissioneGiaTrovato==false){
							validazioneProfiloTrasmissione(messageFactory, child,xmlns);
							profiloTrasmissioneGiaTrovato = true;
						}else{
							if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
								throw new StrutturaBustaException("Header egov con più di un elemento ProfiloTrasmissione","ProfiloTrasmissione");
							}else{
								Eccezione ecc = new Eccezione();
								ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
								ecc.setCodiceEccezione(CodiceErroreCooperazione.PROFILO_TRASMISSIONE_PRESENTE_PIU_VOLTE);
								ecc.setRilevanza(LivelloRilevanza.ERROR);
								if(this.segnalazioneElementoPresentePiuVolte)
									ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_TRASMISSIONE_NON_VALIDO_POSIZIONE+" "+CostantiProtocollo.ECCEZIONE_ELEMENTO_PRESENTE_PIU_VOLTE);
								else
									ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_TRASMISSIONE_NON_VALIDO_POSIZIONE.toString());
								this.erroriValidazione.add(ecc);
							}
						}
					}
				}
				//else if((child.getNodeName().equals(xmlns+"Sequenza"))){
				else if(SoapUtils.matchLocalName(messageFactory, child, "Sequenza", xmlns, SPCoopCostanti.NAMESPACE_EGOV)){
					if(localizzaSolamenteDatiIdentificativiMinimi==false){
						if(sequenzaGiaTrovato==false){
							validazioneSequenza(messageFactory, child,xmlns);
							sequenzaGiaTrovato = true;
						}else{
							if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
								throw new StrutturaBustaException("Header egov con più di un elemento Sequenza","Sequenza");
							}else{
								Eccezione ecc = new Eccezione();
								ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
								ecc.setCodiceEccezione(CodiceErroreCooperazione.CONSEGNA_IN_ORDINE_PRESENTE_PIU_VOLTE);
								ecc.setRilevanza(LivelloRilevanza.ERROR);
								if(this.segnalazioneElementoPresentePiuVolte)
									ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_SEQUENZA_NON_VALIDA_POSIZIONE+" "+CostantiProtocollo.ECCEZIONE_ELEMENTO_PRESENTE_PIU_VOLTE);
								else
									ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_SEQUENZA_NON_VALIDA_POSIZIONE.toString());
								this.erroriValidazione.add(ecc);
							}
						}
					}
				}else{
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.FORMATO_INTESTAZIONE_NON_CORRETTO);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione("Messaggio/child["+child.getNodeName()+"]");
					this.erroriValidazione.add(ecc);
				}
			}

			if(localizzaSolamenteDatiIdentificativiMinimi){
				// una volta letto il messaggio, anche minimo, e' possibile utilizzarlo.
				return true;
			}
			
			// Controllo scadenza messaggio rispetto ora registrazione
			if(this.spcoopProperties.isRepositoryBusteFiltraBusteScaduteRispettoOraRegistrazione() && (this.messaggioScaduto==false)){
				
				// Check su OraRegistrazione
				// Se correttamente formato, altrimenti segnalero' poi il problema
				Date oraRegistrazioneMinimaAccettata = new Date(DateManager.getTimeMillis()-(this.spcoopProperties.getIntervalloScadenzaBuste()*60*1000));
				/*System.out.println("BUSTA ["+this.busta.getOraRegistrazione().toString()
						+"]   MINIMA ["+oraRegistrazioneMinimaAccettata.toString()+"]");*/
				if(this.busta.getOraRegistrazione()!=null){
					if( this.busta.getOraRegistrazione().before(oraRegistrazioneMinimaAccettata)){
						this.log.error("OraRegistrazione portata nella busta ("+SPCoopUtils.getDate_eGovFormat(this.busta.getOraRegistrazione())+") più vecchia della data minima attesa ("+SPCoopUtils.getDate_eGovFormat(oraRegistrazioneMinimaAccettata)+") e scadenza non presente");
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						ecc.setCodiceEccezione(CodiceErroreCooperazione.MESSAGGIO_SCADUTO);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_SCADENZA_NON_VALIDA_POSIZIONE.toString());
						this.erroriValidazione.add(ecc);
					}
				}
				
				// Check su id egov
				// Se correttamente formato, altrimenti segnalero' poi il problema
				if(this.busta.getID()!=null){
					String [] split = this.busta.getID().split("_");
					if(split != null && split.length == 5){
						Date dataIntoIDEgov = null;
						try{
							SimpleDateFormat dateformat = DateUtils.getSimpleDateFormatMinute();
							dataIntoIDEgov = dateformat.parse(split[3]+"_"+split[4]);
						}catch(Exception e){
							// ignore
						}
						if(dataIntoIDEgov!=null){
							//System.out.println("DATA IDEGOV BUSTA ["+dataIntoIDEgov.toString()
							//		+"]   MINIMA ["+oraRegistrazioneMinimaAccettata.toString()+"]");
							if( dataIntoIDEgov.before(oraRegistrazioneMinimaAccettata)){
								this.log.error("Data presente nell'idEgov della busta ("+SPCoopUtils.getDate_eGovFormat(dataIntoIDEgov)+") più vecchia della data minima attesa ("+SPCoopUtils.getDate_eGovFormat(oraRegistrazioneMinimaAccettata)+") e scadenza non presente");
								Eccezione ecc = new Eccezione();
								ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
								ecc.setCodiceEccezione(CodiceErroreCooperazione.MESSAGGIO_SCADUTO);
								ecc.setRilevanza(LivelloRilevanza.ERROR);
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_SCADENZA_NON_VALIDA_POSIZIONE.toString());
								this.erroriValidazione.add(ecc);
							}
						}
					}
				}
			}

			
			// Altri Elementi
			if(list.size()>1){
				boolean listaRiscontriGiaPresente = false;
				boolean listaTrasmissioniGiaPresente = false;
				boolean listaEccezioniGiaPresente = false;
				for(int i =1; i<list.size();i++){
					Node child = list.get(i);
					if(SoapUtils.matchLocalName(messageFactory, child, "IntestazioneMessaggio", xmlns, SPCoopCostanti.NAMESPACE_EGOV)){
						if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
							throw new StrutturaBustaException("Header egov con più di un elemento IntestazioneMessaggio","IntestazioneMessaggio");
						}else{
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.FORMATO_INTESTAZIONE_NON_CORRETTO);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							if(this.segnalazioneElementoPresentePiuVolte)
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_FORMATO_INTESTAZIONE_NON_CORRETTO_POSIZIONE_INTESTAZIONE_MESSAGGIO+" "+CostantiProtocollo.ECCEZIONE_ELEMENTO_PRESENTE_PIU_VOLTE);
							else
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_FORMATO_INTESTAZIONE_NON_CORRETTO_POSIZIONE_INTESTAZIONE_MESSAGGIO.toString());
							this.erroriValidazione.add(ecc);
						}
					}
					//else if((child.getNodeName().equals(xmlns+"ListaRiscontri"))){
					else if(SoapUtils.matchLocalName(messageFactory, child, "ListaRiscontri", xmlns, SPCoopCostanti.NAMESPACE_EGOV)){
						if(listaRiscontriGiaPresente==false){
							validazioneListaRiscontri(messageFactory, child,xmlns);
							listaRiscontriGiaPresente = true;
						}else{
							if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
								throw new StrutturaBustaException("Header egov con più di un elemento ListaRiscontri","ListaRiscontri");
							}else{
								Eccezione ecc = new Eccezione();
								ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
								ecc.setCodiceEccezione(CodiceErroreCooperazione.LISTA_RISCONTRI_PRESENTE_PIU_VOLTE);
								ecc.setRilevanza(LivelloRilevanza.ERROR);
								if(this.segnalazioneElementoPresentePiuVolte)
									ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_RISCONTRI_NON_VALIDA_POSIZIONE+" "+CostantiProtocollo.ECCEZIONE_ELEMENTO_PRESENTE_PIU_VOLTE);
								else
									ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_RISCONTRI_NON_VALIDA_POSIZIONE.toString());
								this.erroriValidazione.add(ecc);
							}
						}
					}
					//else if((child.getNodeName().equals(xmlns+"ListaTrasmissioni"))){
					else if(SoapUtils.matchLocalName(messageFactory, child, "ListaTrasmissioni", xmlns, SPCoopCostanti.NAMESPACE_EGOV)){
						if(listaTrasmissioniGiaPresente==false){
							validazioneListaTrasmissioni(messageFactory, child,xmlns);
							listaTrasmissioniGiaPresente = true;
						}else{
							if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
								throw new StrutturaBustaException("Header egov con più di un elemento ListaTrasmissioni","ListaTrasmissioni");
							}else{
								Eccezione ecc = new Eccezione();
								ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
								ecc.setCodiceEccezione(CodiceErroreCooperazione.LISTA_TRASMISSIONI_PRESENTE_PIU_VOLTE);
								ecc.setRilevanza(LivelloRilevanza.ERROR);
								if(this.segnalazioneElementoPresentePiuVolte)
									ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE+" "+CostantiProtocollo.ECCEZIONE_ELEMENTO_PRESENTE_PIU_VOLTE);
								else
									ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE.toString());
								this.erroriValidazione.add(ecc);
							}
						}
					}
					//else if((child.getNodeName().equals(xmlns+"ListaEccezioni"))){
					else if(SoapUtils.matchLocalName(messageFactory, child, "ListaEccezioni", xmlns, SPCoopCostanti.NAMESPACE_EGOV)){
						if(listaEccezioniGiaPresente==false){
							validazioneListaEccezioni(messageFactory, child,xmlns);
							listaEccezioniGiaPresente = true;
						}else{
							if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
								throw new StrutturaBustaException("Header egov con più di un elemento ListaEccezioni","ListaEccezioni");
							}else{
								Eccezione ecc = new Eccezione();
								ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
								ecc.setCodiceEccezione(CodiceErroreCooperazione.FORMATO_INTESTAZIONE_NON_CORRETTO);
								ecc.setRilevanza(LivelloRilevanza.ERROR);
								if(this.segnalazioneElementoPresentePiuVolte)
									ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_ECCEZIONI_NON_VALIDA_POSIZIONE+" "+CostantiProtocollo.ECCEZIONE_ELEMENTO_PRESENTE_PIU_VOLTE);
								else
									ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_ECCEZIONI_NON_VALIDA_POSIZIONE.toString());
								this.errorsTrovatiSullaListaEccezioni.add(ecc);
							}
						}
					}else{
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						ecc.setCodiceEccezione(CodiceErroreCooperazione.FORMATO_INTESTAZIONE_NON_CORRETTO);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						ecc.setDescrizione("Intestazione/child["+child.getNodeName()+"]");
						this.erroriValidazione.add(ecc);
					}
				}
			} 

			
			if(this.spcoopProperties.isCheckTolleranzaDateFutureAttivo()){
				if(this.erroriValidazione.size()==0){
					// controllo che non vi siano date future
					validazioneDatePresentiRispettoDateFuture();
				}
			}

		} catch(StrutturaBustaException e) {
			this.log.error("Struttura della busta non corretta: "+e.getMessage(),e);
			this.msgErrore =  e.getMessage();
			this.codiceErrore = CodiceErroreCooperazione.FORMATO_INTESTAZIONE_NON_CORRETTO;
			return false; 
		} catch(Exception e) {
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.PROCESSAMENTO);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO);
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione("Errore di processamento durante la validazione sintattica");
			this.erroriProcessamento.add(ecc);
			this.log.error("Errore di processamento durante la validazione sintattica",e);
		}

		// una volta letto il messaggio e' possibile utilizzarlo.
		return true;
	}

	
	public SPCoopBustaRawContent getHeaderEGov_senzaControlli() throws ProtocolException{
		try{	
			// Estraggo header
			if(this.headerSOAP==null)
				this.headerSOAP = this.msg.getSOAPHeader();
			if(this.headerSOAP==null){
				throw new Exception("Analizzato un messaggio senza header");
			}	
			
			// cerco la busta per l'actor
			java.util.Iterator<?> it = this.headerSOAP.examineAllHeaderElements();
			SOAPHeaderElement headerElementEGov = null;
			while( it.hasNext()  ){

				// Test Header Element
				SOAPHeaderElement headerElement = (SOAPHeaderElement) it.next();

				//Controllo Actor
				if( SPCoopCostanti.ACTOR_EGOV.equals(headerElement.getActor()) == false  ){
					continue;
				}
				headerElementEGov = headerElement;
			}
			
			if(headerElementEGov==null){
				// cerco la busta per il namespace
				it = this.headerSOAP.examineAllHeaderElements();
				while( it.hasNext()  ){

					// Test Header Element
					SOAPHeaderElement headerElement = (SOAPHeaderElement) it.next();

					//Controllo Namespace
					if( SPCoopCostanti.NAMESPACE_EGOV.equals(headerElement.getNamespaceURI()) == false  ){
						continue;
					}
					headerElementEGov = headerElement;
				}
			}
			
			if(headerElementEGov==null){
				// header egov non trovato
				throw new Exception("Header eGov non presente");
			}else{
				return new SPCoopBustaRawContent(headerElementEGov);
			}
		}catch(Exception e){
			throw new ProtocolException("Lettura non riuscita: "+e.getMessage(),e);
		}
	}
	
	/**
	 * Metodo che si occupa di verificare che sia presente un header eGov nel SOAPHeader <var>SOAPHeader</var>.
	 * Per essere presente, un header eGov deve possedere almeno i seguenti elementi obbligatori :
	 * Intestazione con :
	 * <p>
	 * <ul>
	 * <li> IntestazioneMessaggio-Mittente-IdentificativoParte con tipo e valore
	 * <li> IntestazioneMessaggio-Destinatario-IdentificativoParte con tipo e valore
	 * <li> IntestazioneMessaggio-Messaggio-....
	 * </ul>
	 * <p>
	 * Se la verifica non ha successo, il metodo ritorna null, altrimenti l'header eGov presente (non estratto).
	 *
	 * @param header Header Soap in cui deve essere verificato la presenza di un header eGov.
	 * @return null se la verifica ha successo, altrimenti l'header eGov presente (non estratto).
	 * 
	 */
	public SPCoopBustaRawContent getHeaderEGov(OpenSPCoop2MessageFactory messageFactory, SOAPHeader header) throws ProtocolException,StrutturaBustaException{
		try{	

			if(header == null)
				return null;
			
			// cerco la busta per l'actor
			java.util.Iterator<?> it = header.examineAllHeaderElements();
			SOAPHeaderElement headerElementEGov = null;
			StringBuilder bf = new StringBuilder();
			while( it.hasNext()  ){

				// Test Header Element
				SOAPHeaderElement headerElement = (SOAPHeaderElement) it.next();

				//Controllo Actor
				try{
					bf.append("Check ACTOR Atteso["+SPCoopCostanti.ACTOR_EGOV+"]==["+headerElement.getActor()+"]=["+SPCoopCostanti.ACTOR_EGOV.equals(headerElement.getActor())+"]\n");
				}catch(Exception e){
					// ignore
				}

				if( SPCoopCostanti.ACTOR_EGOV.equals(headerElement.getActor()) == false  ){
					continue;
				}
				bf.append("FIND!\n");
				headerElementEGov = headerElement;
			}
			
			if(headerElementEGov==null){
				bf.append("NOT FOUND TRAMITE ACTOR!\n");
				// cerco la busta per il namespace
				it = header.examineAllHeaderElements();
				while( it.hasNext()  ){

					// Test Header Element
					SOAPHeaderElement headerElement = (SOAPHeaderElement) it.next();

					//Controllo Namespace
					try{
						bf.append("Check NAMESPACE Atteso["+SPCoopCostanti.NAMESPACE_EGOV+"]==["+headerElement.getNamespaceURI()+"]=["+SPCoopCostanti.NAMESPACE_EGOV.equals(headerElement.getNamespaceURI())+"]\n");
					}catch(Exception e){
						// ignore
					}
					if( SPCoopCostanti.NAMESPACE_EGOV.equals(headerElement.getNamespaceURI()) == false  ){
						continue;
					}
					bf.append("FIND!\n");
					headerElementEGov = headerElement;
				}
			}
			
			if(headerElementEGov==null){
				// header egov non trovato
				String msgHeader = "";
				try{
					msgHeader = " header-soap: "+messageFactory.createEmptyMessage(MessageType.SOAP_11,MessageRole.NONE).getAsString(header, false);
				}catch(Exception e){
					// ignore
				}
				throw new Exception("Header eGov non presente ("+bf.toString()+")"+msgHeader);
			}
			
			// Preparazione busta di default per eventuale eccezione
			Busta errore = new Busta(this.protocolFactory.getProtocol());
			errore.setTipoMittente(this.spcoopProperties.getKeywordTipoMittenteSconosciuto());
			errore.setMittente(this.spcoopProperties.getKeywordMittenteSconosciuto());
			errore.setIdentificativoPortaMittente(this.traduttore.getIdentificativoPortaDefault(new IDSoggetto(errore.getTipoMittente(), errore.getMittente())));
			errore.setTipoDestinatario(this.spcoopProperties.getKeywordTipoMittenteSconosciuto());
			errore.setDestinatario(this.spcoopProperties.getKeywordMittenteSconosciuto());
			errore.setIdentificativoPortaDestinatario(this.traduttore.getIdentificativoPortaDefault(new IDSoggetto(errore.getTipoDestinatario(), errore.getDestinatario())));
			
			// Controllo presenza più di un header eGov
			if(this.existsMoreHeaderEGov()){
				errore.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.FORMATO_NON_CORRETTO, 
						"Più di un header e-Gov presente",
						this.protocolFactory));
				this.bustaErroreHeaderIntestazione = errore;
				throw new Exception("Più di un header e-Gov presente"); 
			}
			
			// Prefix eGov
			String xmlns = headerElementEGov.getPrefix();
			if(xmlns == null){ 
				xmlns = "";
			}else if(!xmlns.equals("")){
				xmlns = xmlns + ":";
			}
			
			// Controllo presenza elementi obbligatori che contraddistingono un header eGov: Intestazione
			//if(headerElementEGov.getNodeName().equals(xmlns+"Intestazione") == false){
			if(SoapUtils.matchLocalName(messageFactory, headerElementEGov, "Intestazione", xmlns, SPCoopCostanti.NAMESPACE_EGOV) == false ){
				this.bustaErroreHeaderIntestazione = errore;
				this.bustaErroreHeaderIntestazione.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.FORMATO_NON_CORRETTO, 
						SPCoopCostantiPosizioneEccezione.ECCEZIONE_FORMATO_NON_CORRETTO_POSIZIONE.toString(),this.protocolFactory));
				throw new Exception("Header eGov senza header intestazione");
			}

			// Controllo elementi che contraddistingono un header eGov : Intestazione Messaggio
			List<Node> list = SoapUtils.getNotEmptyChildNodes(messageFactory, headerElementEGov);
			if(list==null || list.size() == 0){ 
				this.bustaErroreHeaderIntestazione = errore;
				this.bustaErroreHeaderIntestazione.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.FORMATO_INTESTAZIONE_NON_CORRETTO, 
						SPCoopCostantiPosizioneEccezione.ECCEZIONE_FORMATO_INTESTAZIONE_NON_CORRETTO_POSIZIONE_INTESTAZIONE_MESSAGGIO.toString(),this.protocolFactory));
				throw new Exception("Header eGov con header intestazione senza elementi interni tra cui IntestazioneMessaggio");
			} 
			Node intestazioneMsg = list.get(0);
			//if( (intestazioneMsg==null) ||  (!(intestazioneMsg.getNodeName().equals(xmlns+"IntestazioneMessaggio")))  ) {
			if( (intestazioneMsg==null) ||   (!SoapUtils.matchLocalName(messageFactory, intestazioneMsg, "IntestazioneMessaggio", xmlns, SPCoopCostanti.NAMESPACE_EGOV)) ) {
				this.bustaErroreHeaderIntestazione = errore;
				this.bustaErroreHeaderIntestazione.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.FORMATO_INTESTAZIONE_NON_CORRETTO, 
						SPCoopCostantiPosizioneEccezione.ECCEZIONE_FORMATO_INTESTAZIONE_NON_CORRETTO_POSIZIONE_INTESTAZIONE_MESSAGGIO.toString(),this.protocolFactory));
				throw new Exception("Header eGov con header intestazione che possiede first child ["+(intestazioneMsg!=null ? intestazioneMsg.getNodeName() : "null")+"] diverso da IntestazioneMessaggio");
			}
			
			List<Node> intestMsgChild = SoapUtils.getNotEmptyChildNodes(messageFactory, intestazioneMsg);
			
			// Controllo elementi principali
			Node mittente = null;
			Node destinatario = null;
			Node messaggio = null;
			for(int i=0;i<intestMsgChild.size();i++){
				Node child = intestMsgChild.get(i);
				if(child==null){
					this.log.info("Elemento null");
				}else if(child.getNodeName()==null){
					this.log.info("Elemento child null");
				}
				if(child!=null && child.getNodeName()!=null){
					//if( (mittente==null) && ((child.getNodeName().equals(xmlns+"Mittente")))){
					if( (mittente==null) && (SoapUtils.matchLocalName(messageFactory, child, "Mittente", xmlns, SPCoopCostanti.NAMESPACE_EGOV))){
						mittente = child; 
					}
					//else if( (destinatario==null) && ((child.getNodeName().equals(xmlns+"Destinatario")))){
					else if( (destinatario==null) && (SoapUtils.matchLocalName(messageFactory, child, "Destinatario", xmlns, SPCoopCostanti.NAMESPACE_EGOV))){
						destinatario = child;
					}
					//else if( (messaggio==null) && ((child.getNodeName().equals(xmlns+"Messaggio")))){
					else if( (messaggio==null) && (SoapUtils.matchLocalName(messageFactory, child, "Messaggio", xmlns, SPCoopCostanti.NAMESPACE_EGOV))){
						messaggio = child;
					}
				}
			}
			
			boolean eccezioneStrutturaMittente = false;
			boolean eccezioneStrutturaDestinatario = false;
			boolean eccezioneStrutturaMessaggio = false;
			
			// controllo mittente
			if(mittente==null){
				errore.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.MITTENTE_NON_PRESENTE, 
						SPCoopCostantiPosizioneEccezione.ECCEZIONE_MITTENTE_SCONOSCIUTO_POSIZIONE.toString(),this.protocolFactory));
				eccezioneStrutturaMittente = true;
			}else{
				List<Node> headerMittente = SoapUtils.getNotEmptyChildNodes(messageFactory, mittente); // identificativoParte mitt
				if( (headerMittente==null) || (headerMittente.size() == 0) ){
					errore.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.MITTENTE_NON_PRESENTE, 
							SPCoopCostantiPosizioneEccezione.ECCEZIONE_MITTENTE_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE.toString(),this.protocolFactory));
					eccezioneStrutturaMittente = true;
				} else {
					for(int i=0; i<headerMittente.size(); i++){
						Node idParteMittente = headerMittente.get(i);
						//if( !(idParteMittente.getNodeName().equals(xmlns+"IdentificativoParte"))  ){ 
						if( !(SoapUtils.matchLocalName(messageFactory, idParteMittente, "IdentificativoParte", xmlns, SPCoopCostanti.NAMESPACE_EGOV))  ){ 
							errore.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.MITTENTE_NON_PRESENTE, 
									SPCoopCostantiPosizioneEccezione.ECCEZIONE_MITTENTE_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE.toString(),this.protocolFactory));
							eccezioneStrutturaMittente = true;
							break;
						}
						List<Node> valueIDParteMitt = SoapUtils.getNotEmptyChildNodes(messageFactory, idParteMittente);
						if( (valueIDParteMitt==null) || (valueIDParteMitt.size() == 0) || (valueIDParteMitt.size() > 1) ){ 
							errore.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.MITTENTE_NON_VALORIZZATO, 
									SPCoopCostantiPosizioneEccezione.ECCEZIONE_MITTENTE_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE.toString(),this.protocolFactory));
							eccezioneStrutturaMittente = false;
							break;
						} 
						String mittenteValue = null;
						try{
							mittenteValue = valueIDParteMitt.get(0).getNodeValue();
							if(mittenteValue==null)
								throw new Exception("mittente is null");
							//log.info("Value identificativo parte ["+valueIDParteMitt.item(0).getNodeValue()+"]");
						} catch(Exception e) {
							errore.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.MITTENTE_NON_VALORIZZATO, 
									SPCoopCostantiPosizioneEccezione.ECCEZIONE_MITTENTE_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE.toString(),this.protocolFactory));
							eccezioneStrutturaMittente = false;
							break;
						}
						String tipoMittente = null;
						Node hrefFindMitt = null;
						if(this.readQualifiedAttribute){
							hrefFindMitt = SoapUtils.getQualifiedAttributeNode(messageFactory, idParteMittente, "tipo", SPCoopCostanti.NAMESPACE_EGOV);
						}else{
							hrefFindMitt = SoapUtils.getAttributeNode(messageFactory, idParteMittente, "tipo");
						}
						if(hrefFindMitt!=null){
							try{
								tipoMittente = hrefFindMitt.getNodeValue();
								if(tipoMittente == null)
									throw new Exception("tipo non definito");
								//log.info("Value identificativo parte ["+hrefFindMitt.getNodeValue()+"]");
							} catch(Exception e) {
								errore.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.TIPO_MITTENTE_NON_VALIDO, 
										SPCoopCostantiPosizioneEccezione.ECCEZIONE_MITTENTE_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE_TIPO.toString(),this.protocolFactory));
								eccezioneStrutturaMittente = true;
								break;
							}
						}else{
							errore.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.TIPO_MITTENTE_NON_PRESENTE, 
									SPCoopCostantiPosizioneEccezione.ECCEZIONE_MITTENTE_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE_TIPO.toString(),this.protocolFactory));
							eccezioneStrutturaMittente = true;
							break;
						}   
						if(i==0){
							if(tipoMittente!=null) {
								try {
									errore.setTipoMittente(this.traduttore.toRegistryOrganizationType(tipoMittente));
								}catch(Exception e) {
									errore.setTipoMittente(tipoMittente); // senza traduzione
								}
							}
							errore.setMittente(mittenteValue);
						}else{
							//errore.addEccezione(Eccezione.getEccezioneValidazione(Costanti.ECCEZIONE_MITTENTE_SCONOSCIUTO, 
							//		Costanti.ECCEZIONE_MITTENTE_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE+":"+tipoMittente+"/"+mittenteValue+" (busta con più di un mittente non gestita)" ));
							errore.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.MITTENTE_PRESENTE_PIU_VOLTE, 
											SPCoopCostantiPosizioneEccezione.ECCEZIONE_MITTENTE_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE.toString(),this.protocolFactory));
							eccezioneStrutturaMittente = false;
						}
					}
				}
			}
			
			// controllo destinatario
			if(destinatario==null){
				errore.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.DESTINATARIO_NON_PRESENTE, 
						SPCoopCostantiPosizioneEccezione.ECCEZIONE_DESTINATARIO_SCONOSCIUTO_POSIZIONE.toString(),this.protocolFactory));
				eccezioneStrutturaDestinatario = true;
			}else{
				List<Node> headerDestinatario = SoapUtils.getNotEmptyChildNodes(messageFactory, destinatario); // identificativoParte dest
				if( (headerDestinatario==null) || (headerDestinatario.size() == 0) ){
					errore.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.DESTINATARIO_NON_PRESENTE, 
							SPCoopCostantiPosizioneEccezione.ECCEZIONE_DESTINATARIO_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE.toString(),this.protocolFactory));
					eccezioneStrutturaDestinatario = true;
				} else {
					for(int i=0; i<headerDestinatario.size(); i++){
						Node idParteDestinatario = headerDestinatario.get(i);
						//if( !(idParteDestinatario.getNodeName().equals(xmlns+"IdentificativoParte"))  ){
						if( !(SoapUtils.matchLocalName(messageFactory, idParteDestinatario, "IdentificativoParte", xmlns, SPCoopCostanti.NAMESPACE_EGOV))  ){ 
							errore.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.DESTINATARIO_NON_VALIDO, 
									SPCoopCostantiPosizioneEccezione.ECCEZIONE_DESTINATARIO_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE.toString(),this.protocolFactory));
							eccezioneStrutturaDestinatario = true;
							break;
						}
						List<Node> valueIDParteDest = SoapUtils.getNotEmptyChildNodes(messageFactory, idParteDestinatario);
						if( (valueIDParteDest==null) || (valueIDParteDest.size() == 0) || (valueIDParteDest.size() > 1) ){ 
							errore.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.DESTINATARIO_NON_VALIDO, 
									SPCoopCostantiPosizioneEccezione.ECCEZIONE_DESTINATARIO_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE.toString(),this.protocolFactory));
							eccezioneStrutturaDestinatario = false;
							break;
						} 
						String destinatarioValue = null;
						try{
							destinatarioValue = valueIDParteDest.get(0).getNodeValue();
							if(destinatarioValue==null)
								throw new Exception("destinatario is null");
							//log.info("Value identificativo parte ["+valueIDParteDest.item(0).getNodeValue()+"]");
						} catch(Exception e) {
							errore.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.DESTINATARIO_NON_VALORIZZATO, 
									SPCoopCostantiPosizioneEccezione.ECCEZIONE_DESTINATARIO_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE.toString(),this.protocolFactory));
							eccezioneStrutturaDestinatario = false;
							break;
						}
						String tipoDestinatario = null;
						Node hrefFindDest = null;
						if(this.readQualifiedAttribute){
							hrefFindDest = SoapUtils.getQualifiedAttributeNode(messageFactory, idParteDestinatario, "tipo", SPCoopCostanti.NAMESPACE_EGOV);
						}else{
							hrefFindDest = SoapUtils.getAttributeNode(messageFactory, idParteDestinatario, "tipo");
						}
						if(hrefFindDest!=null){
							try{
								tipoDestinatario = hrefFindDest.getNodeValue();
								if(tipoDestinatario == null)
									throw new Exception("tipo non definito");
								//log.info("Value identificativo parte ["+hrefFindDest.getNodeValue()+"]");
							} catch(Exception e) {
								errore.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.TIPO_DESTINATARIO_NON_VALIDO, 
										SPCoopCostantiPosizioneEccezione.ECCEZIONE_DESTINATARIO_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE_TIPO.toString(),this.protocolFactory));
								eccezioneStrutturaDestinatario = true;
								break;
							}
						}else{
							errore.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.TIPO_DESTINATARIO_NON_PRESENTE, 
									SPCoopCostantiPosizioneEccezione.ECCEZIONE_DESTINATARIO_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE_TIPO.toString(),this.protocolFactory));
							eccezioneStrutturaDestinatario = true;
							break;
						}   
						if(i==0){
							if(tipoDestinatario!=null) {
								try {
									errore.setTipoDestinatario(this.traduttore.toRegistryOrganizationType(tipoDestinatario));
								}catch(Exception e) {
									errore.setTipoDestinatario(tipoDestinatario); // senza traduzione
								}
							}
							errore.setDestinatario(destinatarioValue);
						}else{
							//errore.addEccezione(Eccezione.getEccezioneValidazione(Costanti.ECCEZIONE_DESTINATARIO_SCONOSCIUTO, 
							//		Costanti.ECCEZIONE_DESTINATARIO_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE+":"+tipoDestinatario+"/"+destinatarioValue+" (busta con più di un destinatario non gestita)" ));
							errore.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.DESTINATARIO_PRESENTE_PIU_VOLTE, 
									SPCoopCostantiPosizioneEccezione.ECCEZIONE_DESTINATARIO_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE.toString(),this.protocolFactory));
							eccezioneStrutturaDestinatario = false;
						}
					}
				}
			}
			
			// controllo messaggio
			if(messaggio==null){
				errore.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.FORMATO_INTESTAZIONE_NON_CORRETTO, 
						SPCoopCostantiPosizioneEccezione.ECCEZIONE_FORMATO_INTESTAZIONE_NON_CORRETTO_POSIZIONE_MESSAGGIO.toString(),this.protocolFactory));
				eccezioneStrutturaMessaggio = true;
			}else{
				List<Node> contenutoMsg = SoapUtils.getNotEmptyChildNodes(messageFactory, messaggio);
				if( (contenutoMsg.size() <= 0)){
					errore.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_PRESENTE, 
							SPCoopCostantiPosizioneEccezione.ECCEZIONE_ID_MESSAGGIO_NON_DEFINITO_POSIZIONE.toString(),this.protocolFactory));
					eccezioneStrutturaMessaggio = true;
					
				}else{
					String identificatore = null;
					boolean identificatoreTrovato = false;
					for(int j =0; j<contenutoMsg.size();j++){
						Node childMsg = contenutoMsg.get(j);
						//if((childMsg.getNodeName().equals(xmlns+"Identificatore"))){
						if(SoapUtils.matchLocalName(messageFactory, childMsg, "Identificatore", xmlns, SPCoopCostanti.NAMESPACE_EGOV)){
							identificatoreTrovato = true;
							if (SoapUtils.getNotEmptyChildNodes(messageFactory, childMsg).size() != 1){
								errore.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_VALORIZZATO, 
										SPCoopCostantiPosizioneEccezione.ECCEZIONE_ID_MESSAGGIO_NON_DEFINITO_POSIZIONE.toString(),this.protocolFactory));
							}else{
								try{
									identificatore = SoapUtils.getNotEmptyChildNodes(messageFactory, childMsg).get(0).getNodeValue();
								} catch(Exception e) {
									// ignore
								}
							}
							break;
						}
					}
					if(identificatoreTrovato==false){
						errore.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_PRESENTE, 
								SPCoopCostantiPosizioneEccezione.ECCEZIONE_ID_MESSAGGIO_NON_DEFINITO_POSIZIONE.toString(),this.protocolFactory));
						eccezioneStrutturaMessaggio = true;
					}else if(identificatore==null){
						errore.addEccezione(Eccezione.getEccezioneValidazione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_PRESENTE, 
								SPCoopCostantiPosizioneEccezione.ECCEZIONE_ID_MESSAGGIO_NON_DEFINITO_POSIZIONE.toString(),this.protocolFactory));
						eccezioneStrutturaMessaggio = false;
					}else{
						errore.setID(identificatore);
					}
				}
			}
			
				
			
			// report
			if(errore.sizeListaEccezioni()>0){
				
				if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false && 
						((eccezioneStrutturaMittente) || (eccezioneStrutturaDestinatario) || (eccezioneStrutturaMessaggio))
					){
					Eccezione ec = errore.getEccezione(0);
					throw new StrutturaBustaException("Header egov con struttura errata, "+ec.getDescrizione(this.protocolFactory),ec.getDescrizione(this.protocolFactory).replaceAll("/", ""));
				}	
				
				// Leggo eventuali altri valori presenti
				Node servizio = null;
				Node azione = null;
				Node profiloCollaborazione = null;
				Node collaborazione = null;
				Node profiloTrasmissione = null;
				Node sequenza = null;
				for(int i=0;i<intestMsgChild.size();i++){
					Node child = intestMsgChild.get(i);
					//if( (mittente==null) && ((child.getNodeName().equals(xmlns+"Mittente")))){
					if( (mittente==null) && ((SoapUtils.matchLocalName(messageFactory, child, "Mittente", xmlns, SPCoopCostanti.NAMESPACE_EGOV)))){
						mittente = child; 
					}
					//else if( (destinatario==null) && ((child.getNodeName().equals(xmlns+"Destinatario")))){
					else if( (destinatario==null) && ((SoapUtils.matchLocalName(messageFactory, child, "Destinatario", xmlns, SPCoopCostanti.NAMESPACE_EGOV)))){
						destinatario = child;
					}
					//else if( (servizio==null) && ((child.getNodeName().equals(xmlns+"Servizio")))){
					else if( (servizio==null) && ((SoapUtils.matchLocalName(messageFactory, child, "Servizio", xmlns, SPCoopCostanti.NAMESPACE_EGOV)))){
						servizio = child;
					}
					//else if( (azione==null) && ((child.getNodeName().equals(xmlns+"Azione")))){
					else if( (azione==null) && ((SoapUtils.matchLocalName(messageFactory, child, "Azione", xmlns, SPCoopCostanti.NAMESPACE_EGOV)))){
						azione = child;
					}
					//else if( (profiloCollaborazione==null) && ((child.getNodeName().equals(xmlns+"ProfiloCollaborazione")))){
					else if( (profiloCollaborazione==null) && ((SoapUtils.matchLocalName(messageFactory, child, "ProfiloCollaborazione", xmlns, SPCoopCostanti.NAMESPACE_EGOV)))){
						profiloCollaborazione = child;
					}
					//else if( (collaborazione==null) && ((child.getNodeName().equals(xmlns+"Collaborazione")))){
					else if( (collaborazione==null) && ((SoapUtils.matchLocalName(messageFactory, child, "Collaborazione", xmlns, SPCoopCostanti.NAMESPACE_EGOV)))){
						collaborazione = child;
					}
					//else if( (profiloTrasmissione==null) && ((child.getNodeName().equals(xmlns+"ProfiloTrasmissione")))){
					else if( (profiloTrasmissione==null) && ((SoapUtils.matchLocalName(messageFactory, child, "ProfiloTrasmissione", xmlns, SPCoopCostanti.NAMESPACE_EGOV)))){
						profiloTrasmissione = child;
					}
					//else if( (sequenza==null) && ((child.getNodeName().equals(xmlns+"Sequenza")))){
					else if( (sequenza==null) && ((SoapUtils.matchLocalName(messageFactory, child, "Sequenza", xmlns, SPCoopCostanti.NAMESPACE_EGOV)))){
						sequenza = child;
					}
				}
				
				// Mittente
				if(mittente!=null){
					try{
						List<Node> headerMittente = SoapUtils.getNotEmptyChildNodes(messageFactory, mittente);
						Node idParteMittente = headerMittente.get(0);
						errore.setMittente(SoapUtils.getNotEmptyChildNodes(messageFactory, idParteMittente).get(0).getNodeValue());
					}catch(Exception e){
						// ignore
					}
					try{
						List<Node> headerMittente = SoapUtils.getNotEmptyChildNodes(messageFactory, mittente);
						Node idParteMittente = headerMittente.get(0);
						Node hrefFindMitt = null;
						if(this.readQualifiedAttribute){
							hrefFindMitt = SoapUtils.getQualifiedAttributeNode(messageFactory, idParteMittente, "tipo", SPCoopCostanti.NAMESPACE_EGOV);
						}else{
							hrefFindMitt = SoapUtils.getAttributeNode(messageFactory, idParteMittente, "tipo");
						}
						String itValue = hrefFindMitt.getNodeValue();
						if(itValue!=null) {
							try {
								errore.setTipoMittente(this.traduttore.toRegistryOrganizationType(itValue));
							}catch(Exception e) {
								errore.setTipoMittente(itValue); // senza traduzione
							}
						}
					}catch(Exception e){
						// ignore
					}
					try{
						List<Node> headerMittente = SoapUtils.getNotEmptyChildNodes(messageFactory, mittente);
						Node idParteMittente = headerMittente.get(0);
						Node hrefFindMitt = null;
						if(this.readQualifiedAttribute){
							hrefFindMitt = SoapUtils.getQualifiedAttributeNode(messageFactory, idParteMittente, "indirizzoTelematico", SPCoopCostanti.NAMESPACE_EGOV);
						}else{
							hrefFindMitt = SoapUtils.getAttributeNode(messageFactory, idParteMittente, "indirizzoTelematico");
						}
						String itValue = hrefFindMitt.getNodeValue();
						errore.setIndirizzoMittente(itValue);
					}catch(Exception e){
						// ignore
					}
				}
				
				// Destinatario
				if(destinatario!=null){
					try{
						List<Node> headerDest = SoapUtils.getNotEmptyChildNodes(messageFactory, destinatario);
						Node idParteDest = headerDest.get(0);
						errore.setDestinatario(SoapUtils.getNotEmptyChildNodes(messageFactory, idParteDest).get(0).getNodeValue());
					}catch(Exception e){
						// ignore
					}
					try{
						List<Node> headerDest = SoapUtils.getNotEmptyChildNodes(messageFactory, destinatario);
						Node idParteDest = headerDest.get(0);
						Node hrefFindDest = null;
						if(this.readQualifiedAttribute){
							hrefFindDest = SoapUtils.getQualifiedAttributeNode(messageFactory, idParteDest, "tipo", SPCoopCostanti.NAMESPACE_EGOV);
						}else{
							hrefFindDest = SoapUtils.getAttributeNode(messageFactory, idParteDest, "tipo");
						}
						String itValue = hrefFindDest.getNodeValue();
						if(itValue!=null) {
							try {
								errore.setTipoDestinatario(this.traduttore.toRegistryOrganizationType(itValue));
							}catch(Exception e) {
								errore.setTipoDestinatario(itValue); // senza traduzione
							}
						}
					}catch(Exception e){
						// ignore
					}
					try{
						List<Node> headerDest = SoapUtils.getNotEmptyChildNodes(messageFactory, destinatario);
						Node idParteDest = headerDest.get(0);
						Node hrefFindDest = null;
						if(this.readQualifiedAttribute){
							hrefFindDest = SoapUtils.getQualifiedAttributeNode(messageFactory, idParteDest, "indirizzoTelematico", SPCoopCostanti.NAMESPACE_EGOV);
						}else{
							hrefFindDest = SoapUtils.getAttributeNode(messageFactory, idParteDest, "indirizzoTelematico");
						}
						String itValue = hrefFindDest.getNodeValue();
						errore.setIndirizzoDestinatario(itValue);
					}catch(Exception e){
						// ignore
					}
				}
				
				// Servizio
				if(servizio!=null){
					try{
						errore.setServizio(SoapUtils.getNotEmptyChildNodes(messageFactory, servizio).get(0).getNodeValue());
					}catch(Exception e){
						// ignore
					}
					try{
						Node hrefFind = null;
						if(this.readQualifiedAttribute){
							hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, servizio, "tipo", SPCoopCostanti.NAMESPACE_EGOV);
						}else{
							hrefFind = SoapUtils.getAttributeNode(messageFactory, servizio, "tipo");
						}
						String value = hrefFind.getNodeValue();
						if(value!=null) {
							try {
								errore.setTipoServizio(this.traduttore.toRegistryServiceType(value));
							}catch(Exception e) {
								errore.setTipoServizio(value); // senza traduzione
							}
						}
					}catch(Exception e){
						// ignore
					}
				}
				
				// Azione
				if(azione!=null){
					try{
						errore.setAzione(SoapUtils.getNotEmptyChildNodes(messageFactory, azione).get(0).getNodeValue());
					}catch(Exception e){
						// ignore
					}
				}
				
				// ProfiloDiCollaborazione
				if(profiloCollaborazione!=null){
					try{
						String profilovalue = SoapUtils.getNotEmptyChildNodes(messageFactory, profiloCollaborazione).get(0).getNodeValue();
						errore.setProfiloDiCollaborazione(toProfilo(profilovalue), profilovalue);
					}catch(Exception e){
						// ignore
					}
					try{
						Node hrefFind = null;
						if(this.readQualifiedAttribute){
							hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, profiloCollaborazione, "tipo", SPCoopCostanti.NAMESPACE_EGOV);
						}else{
							hrefFind = SoapUtils.getAttributeNode(messageFactory, profiloCollaborazione, "tipo");
						}
						String value = hrefFind.getNodeValue();
						if(value!=null) {
							try {
								errore.setTipoServizioCorrelato(this.traduttore.toRegistryServiceType(value));
							}catch(Exception e) {
								errore.setTipoServizioCorrelato(value); // senza traduzione
							}
						}
					}catch(Exception e){
						// ignore
					}
					try{
						Node hrefFind = null;
						if(this.readQualifiedAttribute){
							hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, profiloCollaborazione, "servizioCorrelato", SPCoopCostanti.NAMESPACE_EGOV);
						}else{
							hrefFind = SoapUtils.getAttributeNode(messageFactory, profiloCollaborazione, "servizioCorrelato");
						}
						errore.setServizioCorrelato(hrefFind.getNodeValue());
					}catch(Exception e){
						// ignore
					}
				}
				
				// Collaborazione
				if(collaborazione!=null){
					try{
						errore.setCollaborazione(SoapUtils.getNotEmptyChildNodes(messageFactory, collaborazione).get(0).getNodeValue());
					}catch(Exception e){
						// ignore
					}
				}
				
				// Messaggio
				if(messaggio!=null){
					try{
						List<Node> contenutoMsg = SoapUtils.getNotEmptyChildNodes(messageFactory, messaggio);
						for(int j =0; j<contenutoMsg.size();j++){
							Node childMsg = contenutoMsg.get(j);
							//if((childMsg.getNodeName().equals(xmlns+"RiferimentoMessaggio"))){
							if(SoapUtils.matchLocalName(messageFactory, childMsg, "RiferimentoMessaggio", xmlns, SPCoopCostanti.NAMESPACE_EGOV)){
								try{
									errore.setRiferimentoMessaggio(SoapUtils.getNotEmptyChildNodes(messageFactory, childMsg).get(0).getNodeValue());
								}catch(Exception e){
									// ignore
								}
							}
							//else if((childMsg.getNodeName().equals(xmlns+"Scadenza"))){
							else if(SoapUtils.matchLocalName(messageFactory, childMsg, "Scadenza", xmlns, SPCoopCostanti.NAMESPACE_EGOV)){
								try{
									String scadenza = SoapUtils.getNotEmptyChildNodes(messageFactory, childMsg).get(0).getNodeValue();
									Date scadenzaDate = validazioneData(scadenza);
									errore.setScadenza(scadenzaDate);
								}catch(Exception e){
									// ignore
								}
							}
							//else if((childMsg.getNodeName().equals(xmlns+"OraRegistrazione"))){
							else if(SoapUtils.matchLocalName(messageFactory, childMsg, "OraRegistrazione", xmlns, SPCoopCostanti.NAMESPACE_EGOV)){
								try{
									String oraRegistrazione = SoapUtils.getNotEmptyChildNodes(messageFactory, childMsg).get(0).getNodeValue();
									Date oraDate = validazioneData(oraRegistrazione);
									errore.setOraRegistrazione(oraDate);
								}catch(Exception e){
									// ignore
								}
								try{
									Node hrefFind = null;
									if(this.readQualifiedAttribute){
										hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, childMsg, "tempo", SPCoopCostanti.NAMESPACE_EGOV);
									}else{
										hrefFind = SoapUtils.getAttributeNode(messageFactory, childMsg, "tempo");
									}
									String tipoOraRegistrazioneValue = hrefFind.getNodeValue();
									errore.setTipoOraRegistrazione(toTipoOra(tipoOraRegistrazioneValue), tipoOraRegistrazioneValue);
								}catch(Exception e){
									// ignore
								}
							}
						}
					}catch(Exception e){
						// ignore
					}
				}
				
				// Profilo Trasmissione
				if(profiloTrasmissione!=null){
					try{
						Node hrefFind = null;
						if(this.readQualifiedAttribute){
							hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, profiloTrasmissione, "confermaRicezione", SPCoopCostanti.NAMESPACE_EGOV);
						}else{
							hrefFind = SoapUtils.getAttributeNode(messageFactory, profiloTrasmissione, "confermaRicezione");
						}
						if(hrefFind.getNodeValue().equals("true"))
							errore.setConfermaRicezione(true);
						else
							errore.setConfermaRicezione(false);
					}catch(Exception e){
						// ignore
					}
					try{
						Node hrefFind = null;
						if(this.readQualifiedAttribute){
							hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, profiloTrasmissione, "inoltro", SPCoopCostanti.NAMESPACE_EGOV);
						}else{
							hrefFind = SoapUtils.getAttributeNode(messageFactory, profiloTrasmissione, "inoltro");
						}
						String inoltro = hrefFind.getNodeValue();
						errore.setInoltro(toInoltro(inoltro), inoltro);
					}catch(Exception e){
						// ignore
					}
				}
				
				// Sequenza
				if(sequenza!=null){
					try{
						Node hrefFind = null;
						if(this.readQualifiedAttribute){
							hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, sequenza, "numeroProgressivo", SPCoopCostanti.NAMESPACE_EGOV);
						}else{
							hrefFind = SoapUtils.getAttributeNode(messageFactory, sequenza, "numeroProgressivo");
						}
						Long test = Long.valueOf(hrefFind.getNodeValue());
						errore.setSequenza(test.longValue());
					}catch(Exception e){
						// ignore
					}
				}
				
				this.bustaErroreHeaderIntestazione = errore;
				throw new Exception("Header eGov senza alcuni elementi principali: presenza mittente["+(mittente!=null)+"] destinatario["+(destinatario!=null)+"] messaggio["+(messaggio!=null)+"] eccezioni-riscontrate: ["+errore.toStringListaEccezioni(this.getProtocolFactory())+"]"); 
			}
			
			return new SPCoopBustaRawContent(headerElementEGov);
			
		}catch(StrutturaBustaException e){
			throw e;
		}catch(Exception e){
			throw new ProtocolException("Lettura non riuscita: "+e.getMessage(),e);
		}
	}


	/**
	 * Controlla che esista una busta SPCoop nell'header
	 * 
	 * @return true se l'header esiste, false altrimenti
	 */
	public boolean existsHeaderEGov(OpenSPCoop2SoapMessage msg){
		this.msg = msg;
		try{
			if(this.headerEGov!=null){
				return true;
			}else{
				if(msg==null){
					return false;
				}
				if(this.headerSOAP==null)
					this.headerSOAP = this.msg.getSOAPHeader();
				if(this.headerSOAP == null){
					return false;
				}
				
				// cerco la busta per l'actor
				java.util.Iterator<?> it = this.headerSOAP.examineAllHeaderElements();
				SOAPHeaderElement headerElementEGov = null;
				while( it.hasNext()  ){

					// Test Header Element
					SOAPHeaderElement headerElement = (SOAPHeaderElement) it.next();

					//Controllo Actor
					if( SPCoopCostanti.ACTOR_EGOV.equals(headerElement.getActor()) == false  ){
						continue;
					}
					headerElementEGov = headerElement;
				}
				
				if(headerElementEGov==null){
					// cerco la busta per il namespace
					it = this.headerSOAP.examineAllHeaderElements();
					while( it.hasNext()  ){

						// Test Header Element
						SOAPHeaderElement headerElement = (SOAPHeaderElement) it.next();

						//Controllo Namespace
						if( SPCoopCostanti.NAMESPACE_EGOV.equals(headerElement.getNamespaceURI()) == false  ){
							continue;
						}
						headerElementEGov = headerElement;
					}
				}
				
				return headerElementEGov!=null;
			}
			

		}catch(Exception e){
			this.log.error("existsHeaderEGov error: "+e.getMessage(), e);
			return false;
		}
	}
	
	/**
	 * Controlla che esista più di una busta SPCoop nell'header
	 * 
	 * @return true se l'header esiste, false altrimenti
	 */
	public boolean existsMoreHeaderEGov(){
		try{
			if(this.headerSOAP==null)
				this.headerSOAP = this.msg.getSOAPHeader();
			if(this.headerSOAP == null){
				return false;
			}
				
			boolean headerGiaTrovato = false;
			
			// cerco la busta per l'actor
			java.util.Iterator<?> it = this.headerSOAP.examineAllHeaderElements();
			while( it.hasNext()  ){
				
				// Test Header Element
				SOAPHeaderElement headerElement = (SOAPHeaderElement) it.next();

				//Controllo Actor
				if( SPCoopCostanti.ACTOR_EGOV.equals(headerElement.getActor()) == false  ){
					continue;
				}
				if(headerGiaTrovato)
					return true;
				else
					headerGiaTrovato = true;
			}
				
			if(headerGiaTrovato==false){
				// cerco la busta per il namespace
				it = this.headerSOAP.examineAllHeaderElements();
				while( it.hasNext()  ){

					// Test Header Element
					SOAPHeaderElement headerElement = (SOAPHeaderElement) it.next();

					//Controllo Namespace
					if( SPCoopCostanti.NAMESPACE_EGOV.equals(headerElement.getNamespaceURI()) == false  ){
						continue;
					}
					
					if(headerGiaTrovato)
						return true;
					else
						headerGiaTrovato = true;
				}
				
			}
			
			return false;
			

		}catch(Exception e){
			this.log.error("existsMoreHeaderEGov error: "+e.getMessage());
			return false;
		}
	}


	/**
	 * Metodo che ritorna il prefissso eGov
	 * 
	 * @return Prefisso
	 * 
	 */
	public String getPrefix(){

		// Prefix eGov
		String xmlns = this.headerEGov.getElement().getPrefix();
		if(xmlns == null){ 
			xmlns = "";
		}
		if(!xmlns.equals(""))
			xmlns = xmlns + ":";
		return xmlns;
	}



	/**
	 * Metodo che si occupa di validare l'elemento 'Mittente' <var>child</var> secondo specifica eGov.
	 * Il metodo, oltre ad effettuare la validazione, si occupa anche di leggerne il contenuto e 
	 * di impostarlo all'interno dell'oggetto <var>busta</var>.
	 * Mano mano che sono incontrati errori di validazione, viene creato un oggetto :
	 *    {@link Eccezione}, e viene inserito in errors.
	 *
	 * @param child nodo su cui effettuare la validazione.
	 * @throws ProtocolException 
	 * 
	 */
	private void validazioneMittente(OpenSPCoop2MessageFactory messageFactory, Node child,String prefix) throws ProtocolException{

		//log.info("Validazione Mittente...");

		List<Node> headerMittente = SoapUtils.getNotEmptyChildNodes(messageFactory, child);
		Node idParte = headerMittente.get(0);
		//log.info("esamino ["+idParte.getNodeName()+"]"); 
		List<Node> valueIDParte = SoapUtils.getNotEmptyChildNodes(messageFactory, idParte);
		String value =  valueIDParte.get(0).getNodeValue();
		//log.info("Value identificativo parte Mittente ["+value+"]");
		Node hrefFind = null;
		if(this.readQualifiedAttribute){
			hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, idParte, "tipo", SPCoopCostanti.NAMESPACE_EGOV);
		}else{
			hrefFind = SoapUtils.getAttributeNode(messageFactory, idParte, "tipo");
		}
		String tipo = hrefFind.getNodeValue();
		//log.info("Tipo identificativo parte Mittente ["+tipo+"]");
		
		// Controllo tipo
		try {
			this.busta.setTipoMittente(this.traduttore.toRegistryOrganizationType(tipo));
		}catch(Exception e) {
			this.busta.setTipoMittente(tipo); // senza traduzione
		
			this.log.warn(e.getMessage(),e);
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.TIPO_MITTENTE_NON_VALIDO);
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MITTENTE_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE_TIPO.toString());
			this.erroriValidazione.add(ecc);
		}		
		this.busta.setMittente(value);
		String indTelematico = null;
		// indirizzo Telematico
		try{
			Node hrefFindT = null;
			if(this.readQualifiedAttribute){
				hrefFindT = SoapUtils.getQualifiedAttributeNode(messageFactory, idParte, "indirizzoTelematico", SPCoopCostanti.NAMESPACE_EGOV);
			}else{
				hrefFindT = SoapUtils.getAttributeNode(messageFactory, idParte, "indirizzoTelematico");
			}
			if(hrefFindT != null)
				indTelematico = hrefFindT.getNodeValue();
			//log.info("IndirizzoTelematicoMittente ["+indTelematico+"]");
		} catch(Exception e) {
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.INDIRIZZO_MITTENTE_NON_PRESENTE );
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MITTENTE_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE_IND_TELEMATICO.toString());
			this.erroriValidazione.add(ecc);
		}
		if(indTelematico != null && (indTelematico.equals("")==false)){ 
			URL urlCheck = null;
			try{	
				urlCheck = new URL( indTelematico );
				this.busta.setIndirizzoMittente(urlCheck.toString());
			} catch(Exception e) {
				this.busta.setIndirizzoMittente(indTelematico); // comunque lo imposto!
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				ecc.setCodiceEccezione(CodiceErroreCooperazione.INDIRIZZO_MITTENTE_NON_VALIDO);
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MITTENTE_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE_IND_TELEMATICO.toString());
				this.erroriValidazione.add(ecc);
			}
		}	
		

	}

	/**
	 * Metodo che si occupa di validare l'elemento 'Destinatario' <var>child</var> secondo specifica eGov.
	 * Il metodo, oltre ad effettuare la validazione, si occupa anche di leggerne il contenuto e 
	 * di impostarlo all'interno dell'oggetto <var>busta</var>.
	 * Mano mano che sono incontrati errori di validazione, viene creato un oggetto 
	 *    {@link Eccezione}, e viene inserito in errors.
	 *
	 * @param child nodo su cui effettuare la validazione
	 * @throws ProtocolException 
	 * 
	 */
	private void validazioneDestinatario(OpenSPCoop2MessageFactory messageFactory, Node child,String prefix) throws ProtocolException{

		//log.info("Validazione Destinatario...");

		List<Node> headerDestinatario = SoapUtils.getNotEmptyChildNodes(messageFactory, child);
		Node idParte = headerDestinatario.get(0);
		//log.info("esamino ["+idParte.getNodeName()+"]"); 
		List<Node> valueIDParte = SoapUtils.getNotEmptyChildNodes(messageFactory, idParte);
		String value =  valueIDParte.get(0).getNodeValue();
		//log.info("Value identificativo parte Destinatario ["+value+"]");
		Node hrefFind = null;
		if(this.readQualifiedAttribute){
			hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, idParte, "tipo", SPCoopCostanti.NAMESPACE_EGOV);
		}else{
			hrefFind = SoapUtils.getAttributeNode(messageFactory, idParte, "tipo");
		}
		String tipo = hrefFind.getNodeValue();
		//log.info("Tipo identificativo parte Destinatario ["+tipo+"]");
		
		// Controllo tipo
		try {
			this.busta.setTipoDestinatario(this.traduttore.toRegistryOrganizationType(tipo));
		}catch(Exception e) {
			this.busta.setTipoDestinatario(tipo); // senza traduzione
			
			this.log.warn(e.getMessage(),e);
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.TIPO_DESTINATARIO_SCONOSCIUTO );
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_DESTINATARIO_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE_TIPO.toString());
			this.erroriValidazione.add(ecc);
		}
		this.busta.setDestinatario(value);

		String indTelematico = null;
		// indirizzo Telematico
		try{
			Node hrefFindT = null;
			if(this.readQualifiedAttribute){
				hrefFindT = SoapUtils.getQualifiedAttributeNode(messageFactory, idParte, "indirizzoTelematico", SPCoopCostanti.NAMESPACE_EGOV);
			}else{
				hrefFindT = SoapUtils.getAttributeNode(messageFactory, idParte, "indirizzoTelematico");
			}
			if(hrefFindT != null)
				indTelematico = hrefFindT.getNodeValue();
			//log.info("IndirizzoTelematicoMittente ["+indTelematico+"]");
		} catch(Exception e) {
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.INDIRIZZO_DESTINATARIO_NON_PRESENTE );
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_DESTINATARIO_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE_IND_TELEMATICO.toString());
			this.erroriValidazione.add(ecc);
		}
		if(indTelematico != null && (indTelematico.equals("")==false)){ 
			URL urlcheck = null;
			try{	
				urlcheck = new URL( indTelematico );
				this.busta.setIndirizzoDestinatario(urlcheck.toString());
			} catch(Exception e) {
				this.busta.setIndirizzoDestinatario(indTelematico); // comunque lo imposto!
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				ecc.setCodiceEccezione(CodiceErroreCooperazione.INDIRIZZO_DESTINATARIO_NON_VALIDO );
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_DESTINATARIO_SCONOSCIUTO_POSIZIONE_IDENTIFICATIVO_PARTE_IND_TELEMATICO.toString());
				this.erroriValidazione.add(ecc);
			}
		}	
		


	}


	/**
	 * Metodo che si occupa di validare l'elemento 'ProfiloCollaborazione' <var>child</var> secondo specifica eGov.
	 * Il metodo, oltre ad effettuare la validazione, si occupa anche di leggerne il contenuto e 
	 * di impostarlo all'interno dell'oggetto <var>busta</var>.
	 * Mano mano che sono incontrati errori di validazione, viene creato un oggetto 
	 *    {@link Eccezione}, e viene inserito in errors.
	 *
	 * @param child nodo su cui effettuare la validazione
	 * @throws ProtocolException 
	 * 
	 */
	private void validazioneProfiloCollaborazione(OpenSPCoop2MessageFactory messageFactory, Node child,String prefix) throws ProtocolException{

		//log.info("Validazione Profilo di Collaborazione...");
		String profilo = null;

		List<Node> valueProfiloDiCollaborazione = SoapUtils.getNotEmptyChildNodes(messageFactory, child);
		if( valueProfiloDiCollaborazione.size() == 0 || valueProfiloDiCollaborazione.size() > 1  ){ 
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.PROFILO_COLLABORAZIONE_NON_VALIDO);
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_COLLABORAZIONE_SCONOSCIUTO_POSIZIONE.toString());
			this.erroriValidazione.add(ecc);
		}else {
			try{
				profilo = valueProfiloDiCollaborazione.get(0).getNodeValue();
				//log.info("Value Profilo di Collaborazione ["+valueProfiloDiCollaborazione.item(0).getNodeValue()+"]");
				if( (profilo.equals(SPCoopCostanti.PROFILO_COLLABORAZIONE_ONEWAY) == false) && 
						(profilo.equals(SPCoopCostanti.PROFILO_COLLABORAZIONE_SINCRONO) == false) && 
						(profilo.equals(SPCoopCostanti.PROFILO_COLLABORAZIONE_ASINCRONO_SIMMETRICO) == false) && 
						(profilo.equals(SPCoopCostanti.PROFILO_COLLABORAZIONE_ASINCRONO_ASIMMETRICO) == false)){ 
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.PROFILO_COLLABORAZIONE_SCONOSCIUTO);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_COLLABORAZIONE_SCONOSCIUTO_POSIZIONE.toString());
					this.erroriValidazione.add(ecc);
				}
				this.busta.setProfiloDiCollaborazione(toProfilo(profilo), profilo);
			} catch(Exception e) {
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				ecc.setCodiceEccezione(CodiceErroreCooperazione.PROFILO_COLLABORAZIONE_NON_VALIDO);
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_COLLABORAZIONE_SCONOSCIUTO_POSIZIONE.toString());
				this.erroriValidazione.add(ecc); 
			}	    
		}

		// Controllo servizioCorrelato e Tipo
		String tipo = null;
		try{
			Node hrefFind = null;
			if(this.readQualifiedAttribute){
				hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, child, "tipo", SPCoopCostanti.NAMESPACE_EGOV);
			}else{
				hrefFind = SoapUtils.getAttributeNode(messageFactory, child, "tipo");
			}
			if(hrefFind != null)
				tipo = hrefFind.getNodeValue();
			//log.info("Tipo Servizio Correlato ["+tipo+"]");
		} catch(Exception e) {
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.TIPO_SERVIZIO_CORRELATO_NON_VALIDO );
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_COLLABORAZIONE_SCONOSCIUTO_POSIZIONE_TIPO_SERVIZIO_CORRELATO.toString());
			this.erroriValidazione.add(ecc);
		}
		boolean tipoServizioCorrelatoValido = true;
		if(tipo != null){ 
			// Controllo tipo
			try {
				this.busta.setTipoServizioCorrelato(this.traduttore.toRegistryServiceType(tipo));
			}catch(Exception e) {
				tipoServizioCorrelatoValido = false;
				this.busta.setTipoServizioCorrelato(tipo); // senza traduzione
				
				this.log.warn(e.getMessage(),e);
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				ecc.setCodiceEccezione(CodiceErroreCooperazione.TIPO_SERVIZIO_CORRELATO_SCONOSCIUTO );
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_COLLABORAZIONE_SCONOSCIUTO_POSIZIONE_TIPO_SERVIZIO_CORRELATO.toString());
				this.erroriValidazione.add(ecc);
			}
			
			/* OLD CODICE 			
			if(!tipo.equals(Costanti.SERVIZIO_CORRELATO_SPC) &&
					!tipo.equals(Costanti.SERVIZIO_CORRELATO_TEST) &&
					!tipo.equals(Costanti.SERVIZIO_CORRELATO_URL) &&
					!tipo.equals(Costanti.SERVIZIO_CORRELATO_WSDL) &&
					!tipo.equals(Costanti.SERVIZIO_CORRELATO_LDAP) &&
					!tipo.equals(Costanti.SERVIZIO_CORRELATO_UDDI) &&
					!tipo.equals(Costanti.SERVIZIO_CORRELATO_XML_REGISTRY) ){
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(Costanti.CONTESTO_CODIFICA_ECCEZIONE_VALIDAZIONE);
				ecc.setCodiceEccezione(Costanti.ECCEZIONE_PROFILO_COLLABORAZIONE_SCONOSCIUTO );
				ecc.setRilevanza(LivelloRilevanza.GRAVE);
				ecc.setDescrizione(Costanti.ECCEZIONE_PROFILO_COLLABORAZIONE_SCONOSCIUTO_POSIZIONE_TIPO_SERVIZIO_CORRELATO);
				this.erroriValidazione.add(ecc);
			}	
			*/
		}


		String servizioCorrelato = null;
		try{
			Node hrefFind = null;
			if(this.readQualifiedAttribute){
				hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, child, "servizioCorrelato", SPCoopCostanti.NAMESPACE_EGOV);
			}else{
				hrefFind = SoapUtils.getAttributeNode(messageFactory, child, "servizioCorrelato");
			}
			if(hrefFind != null)
				servizioCorrelato = hrefFind.getNodeValue();
			//log.info("Servizio Correlato ["+servizioCorrelato+"]");
		} catch(Exception e) {
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.SERVIZIO_CORRELATO_NON_VALIDO );
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_COLLABORAZIONE_SCONOSCIUTO_POSIZIONE_SERVIZIO_CORRELATO.toString());
			this.erroriValidazione.add(ecc);
		}
		this.busta.setServizioCorrelato(servizioCorrelato);


		// MessaggioSingoloOneWay e Sincrono
		if (   servizioCorrelato != null  && 
				(  SPCoopCostanti.PROFILO_COLLABORAZIONE_ONEWAY.equals(profilo) == true || 
						SPCoopCostanti.PROFILO_COLLABORAZIONE_SINCRONO.equals(profilo) == true    )) {
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.SERVIZIO_CORRELATO_NON_VALIDO);
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_COLLABORAZIONE_SCONOSCIUTO_POSIZIONE_SERVIZIO_CORRELATO.toString());
			this.erroriValidazione.add(ecc);
		}
		if ( tipoServizioCorrelatoValido && (tipo!=null) &&  
				(  SPCoopCostanti.PROFILO_COLLABORAZIONE_ONEWAY.equals(profilo) == true || 
						SPCoopCostanti.PROFILO_COLLABORAZIONE_SINCRONO.equals(profilo) == true    )) {
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.TIPO_SERVIZIO_CORRELATO_NON_VALIDO);
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_COLLABORAZIONE_SCONOSCIUTO_POSIZIONE_TIPO_SERVIZIO_CORRELATO.toString());
			this.erroriValidazione.add(ecc);
		}

	}

	/**
	 * Metodo che si occupa di validare l'elemento 'Collaborazione' <var>child</var> secondo specifica eGov.
	 * <p>
	 * Il metodo, oltre ad effettuare la validazione, si occupa anche di leggerne il contenuto e 
	 * di impostarlo all'interno dell'oggetto <var>busta</var>.
	 * Mano mano che sono incontrati errori di validazione, viene creato un oggetto 
	 *    {@link Eccezione}, e viene inserito in errors.
	 *
	 * @param child nodo su cui effettuare la validazione
	 * @throws ProtocolException 
	 * 
	 */
	private void validazioneCollaborazione(OpenSPCoop2MessageFactory messageFactory, Node child) throws ProtocolException{

		//log.info("Validazione Collaborazione...");
		if ( SoapUtils.getNotEmptyChildNodes(messageFactory, child).size() != 1 ){
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.COLLABORAZIONE_NON_VALIDA);
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_COLLABORAZIONE_SCONOSCIUTA_POSIZIONE.toString());
			this.erroriValidazione.add(ecc);
			return;
		}
		String coll = null;
		try{
			coll = SoapUtils.getNotEmptyChildNodes(messageFactory, child).get(0).getNodeValue();
		} catch(Exception e) {
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.COLLABORAZIONE_NON_VALORIZZATA);
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_COLLABORAZIONE_SCONOSCIUTA_POSIZIONE.toString());
			this.erroriValidazione.add(ecc);
		}
		//log.info("Collaborazione["+coll+"]");
		this.busta.setCollaborazione(coll);
	}

	/**
	 * Metodo che si occupa di validare l'elemento 'Servizio' <var>child</var> secondo specifica eGov.
	 * <p>
	 * Il metodo, oltre ad effettuare la validazione, si occupa anche di leggerne il contenuto e 
	 * di impostarlo all'interno dell'oggetto <var>busta</var>.
	 * Mano mano che sono incontrati errori di validazione, viene creato un oggetto 
	 *    {@link Eccezione}, e viene inserito in errors.
	 *
	 * @param child nodo su cui effettuare la validazione
	 * @throws ProtocolException 
	 * 
	 */
	private void validazioneServizio(OpenSPCoop2MessageFactory messageFactory, Node child,String prefix) throws StrutturaBustaException, ProtocolException{

		//log.info("Validazione servizio...");
		if (SoapUtils.getNotEmptyChildNodes(messageFactory, child).size() != 1){
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.SERVIZIO_NON_VALIDO);
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_SERVIZIO_SCONOSCIUTO_POSIZIONE.toString());
			this.erroriValidazione.add(ecc);
			return;
		}

		String serv = null;
		try{
			serv = SoapUtils.getNotEmptyChildNodes(messageFactory, child).get(0).getNodeValue();
		} catch(Exception e) {
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.SERVIZIO_NON_VALORIZZATO);
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_SERVIZIO_SCONOSCIUTO_POSIZIONE.toString());
			this.erroriValidazione.add(ecc);
		}

		//log.info("Servizio["+serv+"]");
		this.busta.setServizio(serv);

		// Tipo
		String tipo = null;
		try{
			Node hrefFind = null;
			if(this.readQualifiedAttribute){
				hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, child, "tipo", SPCoopCostanti.NAMESPACE_EGOV);
			}else{
				hrefFind = SoapUtils.getAttributeNode(messageFactory, child, "tipo");
			}
			if(hrefFind != null)
				tipo = hrefFind.getNodeValue();
			//log.info("Servizio_tipo ["+tipo+"]");
			
			if (tipo == null){
				if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
					throw new StrutturaBustaException("Header egov con elemento Servizio senza tipo","Servizio");
				} else {
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.TIPO_SERVIZIO_NON_PRESENTE );
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_SERVIZIO_SCONOSCIUTO_POSIZIONE_TIPO.toString());
					this.erroriValidazione.add(ecc);
				}
			}else{
			
				// Controllo tipo
				try {
					this.busta.setTipoServizio(this.traduttore.toRegistryServiceType(tipo));
				}catch(Exception e) {
					this.busta.setTipoServizio(tipo); // senza traduzione
					
					this.log.warn(e.getMessage(),e);
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.TIPO_SERVIZIO_SCONOSCIUTO );
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_SERVIZIO_SCONOSCIUTO_POSIZIONE_TIPO.toString());
					this.erroriValidazione.add(ecc);
				}
				
			}
			
		}catch(StrutturaBustaException e){
			throw e;
		} catch(Exception e) {
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.TIPO_SERVIZIO_NON_VALIDO );
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_SERVIZIO_SCONOSCIUTO_POSIZIONE_TIPO.toString());
			this.erroriValidazione.add(ecc);
		}

	}

	/**
	 * Metodo che si occupa di validare l'elemento 'Azione' <var>child</var> secondo specifica eGov.
	 * <p>
	 * Il metodo, oltre ad effettuare la validazione, si occupa anche di leggerne il contenuto e 
	 * di impostarlo all'interno dell'oggetto <var>busta</var>.
	 * Mano mano che sono incontrati errori di validazione, viene creato un oggetto 
	 *    {@link Eccezione}, e viene inserito in errors.
	 *
	 * @param child nodo su cui effettuare la validazione
	 * @throws ProtocolException 
	 * 
	 */
	private void validazioneAzione(OpenSPCoop2MessageFactory messageFactory, Node child) throws ProtocolException{

		//log.info("Validazione azione...");

		if (SoapUtils.getNotEmptyChildNodes(messageFactory, child).size() != 1){
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.AZIONE_NON_VALIDA);
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_AZIONE_SCONOSCIUTA_POSIZIONE.toString());
			this.erroriValidazione.add(ecc);
			return;
		}

		String azione = null;
		try{
			azione = SoapUtils.getNotEmptyChildNodes(messageFactory, child).get(0).getNodeValue();
		} catch(Exception e) {
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.AZIONE_NON_VALORIZZATA);
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_AZIONE_SCONOSCIUTA_POSIZIONE.toString());
			this.erroriValidazione.add(ecc);
		}

		//log.info("Azione["+azione+"]");
		this.busta.setAzione(azione);
	}

	/**
	 * Metodo che si occupa di validare l'elemento 'Messaggio' <var>child</var> secondo specifica eGov.
	 * <p>
	 * Il metodo, oltre ad effettuare la validazione, si occupa anche di leggerne il contenuto e 
	 * di impostarlo all'interno dell'oggetto <var>busta</var>.
	 * Mano mano che sono incontrati errori di validazione, viene creato un oggetto 
	 *    {@link Eccezione}, e viene inserito in errors.
	 *
	 * @param child nodo su cui effettuare la validazione
	 * @throws ProtocolException 
	 * 
	 */
	private void validazioneMessaggio(OpenSPCoop2MessageFactory messageFactory, Node child,String prefix) throws StrutturaBustaException, ProtocolException{

		// Prefix eGov
		String xmlns = getPrefix();

		//log.info("Validazione Messaggio...");

		List<Node> contenutoMsg = SoapUtils.getNotEmptyChildNodes(messageFactory, child);
		if( (contenutoMsg.size() == 0) || (contenutoMsg.size() > 4)){
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.FORMATO_INTESTAZIONE_NON_CORRETTO);
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione("IntestazioneMessaggio/Messaggio childsize:"+contenutoMsg.size());
			this.erroriValidazione.add(ecc);
		}

		boolean presenzaID = false;
		boolean presenzaOra = false;
		boolean presenzaScadenza = false;
		boolean presenzaRifMessaggio = false;
		
		for(int j =0; j<contenutoMsg.size();j++){
			Node childMsg = contenutoMsg.get(j);

			//if((childMsg.getNodeName().equals(xmlns+"Identificatore"))){
			if(SoapUtils.matchLocalName(messageFactory, childMsg, "Identificatore", xmlns, SPCoopCostanti.NAMESPACE_EGOV)){
				
				
				if(presenzaID){
					if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
						throw new StrutturaBustaException("Header egov con più di un elemento Identificatore","MessaggioIdentificatore");
					}else{
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						ecc.setCodiceEccezione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_PRESENTE_PIU_VOLTE);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						if(this.segnalazioneElementoPresentePiuVolte)
							ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_ID_MESSAGGIO_NON_DEFINITO_POSIZIONE+" "+CostantiProtocollo.ECCEZIONE_ELEMENTO_PRESENTE_PIU_VOLTE);
						else
							ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_ID_MESSAGGIO_NON_DEFINITO_POSIZIONE.toString());
						this.erroriValidazione.add(ecc);
						continue;
					}
				}else{
				
					//log.info("Validazione identificatore...");
					presenzaID = true;
	
					if (SoapUtils.getNotEmptyChildNodes(messageFactory, childMsg).size() != 1){
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						ecc.setCodiceEccezione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_VALORIZZATO);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_ID_MESSAGGIO_NON_DEFINITO_POSIZIONE.toString());
						this.erroriValidazione.add(ecc);
						continue;
					}
					String id = null;
					try{
						id = SoapUtils.getNotEmptyChildNodes(messageFactory, childMsg).get(0).getNodeValue();
					} catch(Exception e) {
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						ecc.setCodiceEccezione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_VALORIZZATO);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_ID_MESSAGGIO_NON_DEFINITO_POSIZIONE.toString());
						this.erroriValidazione.add(ecc);
					}
	
					if(id==null){
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						ecc.setCodiceEccezione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_VALORIZZATO);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_ID_MESSAGGIO_NON_DEFINITO_POSIZIONE.toString());
						this.erroriValidazione.add(ecc);
					}
	
					//log.info("identificatore["+id+"]");
					this.busta.setID(id);
				}

			//}else if((childMsg.getNodeName().equals(xmlns+"OraRegistrazione"))){
			}else if(SoapUtils.matchLocalName(messageFactory, childMsg, "OraRegistrazione", xmlns, SPCoopCostanti.NAMESPACE_EGOV)){
				
				if(presenzaOra){
					if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
						throw new StrutturaBustaException("Header egov con più di un elemento OraRegistrazione","MessaggioOraRegistrazione");
					}else{
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						ecc.setCodiceEccezione(CodiceErroreCooperazione.ORA_REGISTRAZIONE_PRESENTE_PIU_VOLTE);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						if(this.segnalazioneElementoPresentePiuVolte)
							ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_ORA_REGISTRAZIONE_NON_VALIDA_POSIZIONE+" "+CostantiProtocollo.ECCEZIONE_ELEMENTO_PRESENTE_PIU_VOLTE);
						else
							ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_ORA_REGISTRAZIONE_NON_VALIDA_POSIZIONE.toString());
						this.erroriValidazione.add(ecc);
						continue;
					}
				}else{
				
					//log.info("Validazione Ora Registrazione...");
					presenzaOra = true;
	
					if (SoapUtils.getNotEmptyChildNodes(messageFactory, childMsg).size() != 1){
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						ecc.setCodiceEccezione(CodiceErroreCooperazione.ORA_REGISTRAZIONE_NON_PRESENTE);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_ORA_REGISTRAZIONE_NON_VALIDA_POSIZIONE.toString());
						this.erroriValidazione.add(ecc);
						continue;
					}
					String ora = null;
					try{
						ora = SoapUtils.getNotEmptyChildNodes(messageFactory, childMsg).get(0).getNodeValue();
					} catch(Exception e) {
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						ecc.setCodiceEccezione(CodiceErroreCooperazione.ORA_REGISTRAZIONE_NON_VALORIZZATA);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_ORA_REGISTRAZIONE_NON_VALIDA_POSIZIONE.toString());
						this.erroriValidazione.add(ecc);
						continue;
					}
					Date oraDate = null;  
					if(ora != null){
						oraDate = validazioneData(ora);
					}
					if( (ora==null) || (oraDate == null)){
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						ecc.setCodiceEccezione(CodiceErroreCooperazione.ORA_REGISTRAZIONE_NON_VALORIZZATA);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_ORA_REGISTRAZIONE_NON_VALIDA_POSIZIONE.toString());
						this.erroriValidazione.add(ecc);
					}
	
					//log.info("OraRegistrazione["+oraDate+"]");
					this.busta.setOraRegistrazione(oraDate);
	
					// tempo ...
					String tipoOra = null;
					try{
						Node hrefFind = null;
						if(this.readQualifiedAttribute){
							hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, childMsg, "tempo", SPCoopCostanti.NAMESPACE_EGOV);
						}else{
							hrefFind = SoapUtils.getAttributeNode(messageFactory, childMsg, "tempo");
						}
						tipoOra = hrefFind.getNodeValue();
					} catch(Exception e) {
						if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
							throw new StrutturaBustaException("Header egov senza elemento OraRegistrazione tempo","OraRegistrazioneTempo");
						} else {
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.TIPO_ORA_REGISTRAZIONE_NON_VALIDA);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_ORA_REGISTRAZIONE_NON_VALIDA_POSIZIONE_TEMPO.toString());
							this.erroriValidazione.add(ecc);
						}
					}
					if(tipoOra!=null){
						if(!tipoOra.equals(SPCoopCostanti.TIPO_TEMPO_LOCALE) && !tipoOra.equals(SPCoopCostanti.TIPO_TEMPO_SPC)){
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.TIPO_ORA_REGISTRAZIONE_SCONOSCIUTA);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_ORA_REGISTRAZIONE_NON_VALIDA_POSIZIONE_TEMPO.toString());
							this.erroriValidazione.add(ecc);
						}
					}
					this.busta.setTipoOraRegistrazione(toTipoOra(tipoOra), tipoOra);
				}

			//}else if((childMsg.getNodeName().equals(xmlns+"RiferimentoMessaggio"))){
			}else if(SoapUtils.matchLocalName(messageFactory, childMsg, "RiferimentoMessaggio", xmlns, SPCoopCostanti.NAMESPACE_EGOV)){	
				//log.info("Validazione RiferimentoMessaggio...");

				if(presenzaRifMessaggio){
					if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
						throw new StrutturaBustaException("Header egov con più di un elemento RiferimentoMessaggio","MessaggioRiferimentoMessaggio");
					}else{
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						ecc.setCodiceEccezione(CodiceErroreCooperazione.RIFERIMENTO_MESSAGGIO_PRESENTE_PIU_VOLTE);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						if(this.segnalazioneElementoPresentePiuVolte)
							ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_RIFERIMENTO_MESSAGGIO_NON_DEFINITO_POSIZIONE+" "+CostantiProtocollo.ECCEZIONE_ELEMENTO_PRESENTE_PIU_VOLTE);
						else
							ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_RIFERIMENTO_MESSAGGIO_NON_DEFINITO_POSIZIONE.toString());
						this.erroriValidazione.add(ecc);
						continue;
					}
				}else{
				
					presenzaRifMessaggio = true;
					
					if (SoapUtils.getNotEmptyChildNodes(messageFactory, childMsg).size() != 1){
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						ecc.setCodiceEccezione(CodiceErroreCooperazione.RIFERIMENTO_MESSAGGIO_NON_VALORIZZATO);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_RIFERIMENTO_MESSAGGIO_NON_DEFINITO_POSIZIONE.toString());
						this.erroriValidazione.add(ecc);
						continue;
					}
					String rifID = null;
					try{
						rifID = SoapUtils.getNotEmptyChildNodes(messageFactory, childMsg).get(0).getNodeValue();
					} catch(Exception e) {
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						ecc.setCodiceEccezione(CodiceErroreCooperazione.RIFERIMENTO_MESSAGGIO_NON_VALORIZZATO);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_RIFERIMENTO_MESSAGGIO_NON_DEFINITO_POSIZIONE.toString());
						this.erroriValidazione.add(ecc);
					}
	
					if(rifID==null){
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						ecc.setCodiceEccezione(CodiceErroreCooperazione.RIFERIMENTO_MESSAGGIO_NON_VALORIZZATO);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_RIFERIMENTO_MESSAGGIO_NON_DEFINITO_POSIZIONE.toString());
						this.erroriValidazione.add(ecc);
					}
	
					//log.info("RiferimentoMessaggio["+rifID+"]");
					this.busta.setRiferimentoMessaggio(rifID);
				}

			//}else if((childMsg.getNodeName().equals(xmlns+"Scadenza"))){
			}else if(SoapUtils.matchLocalName(messageFactory, childMsg, "Scadenza", xmlns, SPCoopCostanti.NAMESPACE_EGOV)){
				//log.info("Validazione Scadenza...");

				if(presenzaScadenza){
					if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
						throw new StrutturaBustaException("Header egov con più di un elemento Scadenza","MessaggioScadenza");
					}else{
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						ecc.setCodiceEccezione(CodiceErroreCooperazione.SCADENZA_PRESENTE_PIU_VOLTE);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						if(this.segnalazioneElementoPresentePiuVolte)
							ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_SCADENZA_NON_VALIDA_POSIZIONE+" "+CostantiProtocollo.ECCEZIONE_ELEMENTO_PRESENTE_PIU_VOLTE);
						else
							ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_SCADENZA_NON_VALIDA_POSIZIONE.toString());
						this.erroriValidazione.add(ecc);
						continue;
					}
				}else{
					
					presenzaScadenza = true;
					
					if (SoapUtils.getNotEmptyChildNodes(messageFactory, childMsg).size() != 1){
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						ecc.setCodiceEccezione(CodiceErroreCooperazione.SCADENZA_NON_PRESENTE);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_SCADENZA_NON_VALIDA_POSIZIONE.toString());
						this.erroriValidazione.add(ecc);
						continue;
					}
					String scadenza = null;
					try{
						scadenza = SoapUtils.getNotEmptyChildNodes(messageFactory, childMsg).get(0).getNodeValue();
					} catch(Exception e) {
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						ecc.setCodiceEccezione(CodiceErroreCooperazione.SCADENZA_NON_VALIDA);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_SCADENZA_NON_VALIDA_POSIZIONE.toString());
						this.erroriValidazione.add(ecc);
						continue;
					}
					Date scadenzaDate = null; 
					if(scadenza != null){
						scadenzaDate = validazioneData(scadenza);
					}
					if( (scadenza==null) || (scadenzaDate == null)){
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						ecc.setCodiceEccezione(CodiceErroreCooperazione.SCADENZA_NON_VALORIZZATA);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_SCADENZA_NON_VALIDA_POSIZIONE.toString());
						this.erroriValidazione.add(ecc);
						continue;
					}
					if( dataScaduta(scadenza) == true){
						this.messaggioScaduto = true;
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						ecc.setCodiceEccezione(CodiceErroreCooperazione.MESSAGGIO_SCADUTO);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_SCADENZA_NON_VALIDA_POSIZIONE.toString());
						this.erroriValidazione.add(ecc);
					}
	
					//log.info("Scadenza["+scadenzaDate+"]");
					this.busta.setScadenza(scadenzaDate);
				}

			}else{ 
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				ecc.setCodiceEccezione(CodiceErroreCooperazione.FORMATO_INTESTAZIONE_NON_CORRETTO);
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				ecc.setDescrizione("IntestazioneMessaggio/Messaggio/child["+childMsg.getNodeName()+"]");
				this.erroriValidazione.add(ecc);
			}
		}

		if(presenzaID == false){ 
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_PRESENTE);
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_ID_MESSAGGIO_NON_DEFINITO_POSIZIONE.toString());
			this.erroriValidazione.add(ecc);
		}
		if(presenzaOra == false){ 
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.ORA_REGISTRAZIONE_NON_PRESENTE);
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_ORA_REGISTRAZIONE_NON_VALIDA_POSIZIONE.toString());
			this.erroriValidazione.add(ecc);
		}
	}



	/**
	 * Metodo che si occupa di validare l'elemento 'ProfiloTrasmissione' <var>child</var> secondo specifica eGov.
	 * Il metodo, oltre ad effettuare la validazione, si occupa anche di leggerne il contenuto e 
	 * di impostarlo all'interno dell'oggetto <var>busta</var>.
	 * Mano mano che sono incontrati errori di validazione, viene creato un oggetto 
	 *    {@link Eccezione}, e viene inserito in errors.
	 *
	 * @param child nodo su cui effettuare la validazione
	 * @throws ProtocolException 
	 * 
	 */
	private void validazioneProfiloTrasmissione(OpenSPCoop2MessageFactory messageFactory, Node child,String prefix) throws ProtocolException{

		//log.info("Validazione profilo Trasmissione...");

		if (SoapUtils.getNotEmptyChildNodes(messageFactory, child).size() != 0){
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.PROFILO_TRASMISSIONE_NON_VALIDO);
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_TRASMISSIONE_NON_VALIDO_POSIZIONE+" child size:"+SoapUtils.getNotEmptyChildNodes(messageFactory,child).size());
			this.erroriValidazione.add(ecc);
		}
		String inoltro = null;
		String confermaRicezione = null;
		try{
			Node hrefFind = null;
			if(this.readQualifiedAttribute){
				hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, child, "inoltro", SPCoopCostanti.NAMESPACE_EGOV);
			}else{
				hrefFind = SoapUtils.getAttributeNode(messageFactory, child, "inoltro");
			}
			inoltro = hrefFind.getNodeValue();
			//log.info("Inoltro ["+inoltro+"]");
		} catch(Exception e) {
			// ignore
		}
		try{
			Node hrefFind = null;
			if(this.readQualifiedAttribute){
				hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, child, "confermaRicezione", SPCoopCostanti.NAMESPACE_EGOV);
			}else{
				hrefFind = SoapUtils.getAttributeNode(messageFactory, child, "confermaRicezione");
			}
			confermaRicezione = hrefFind.getNodeValue();
			//log.info("confermaRicezione ["+confermaRicezione+"]");
		} catch(Exception e) {
			// ignore
		}

		// Inoltro...
		if(inoltro == null ){
			// Default: EGOV_IT_PIUDIUNAVOLTA
			inoltro = SPCoopCostanti.PROFILO_TRASMISSIONE_CON_DUPLICATI;
		} else {
			if( (inoltro.equals(SPCoopCostanti.PROFILO_TRASMISSIONE_SENZA_DUPLICATI) == false ) &&
					(inoltro.equals(SPCoopCostanti.PROFILO_TRASMISSIONE_CON_DUPLICATI) == false )  ){
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				ecc.setCodiceEccezione(CodiceErroreCooperazione.PROFILO_TRASMISSIONE_FILTRO_DUPLICATI_SCONOSCIUTO);
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_TRASMISSIONE_NON_VALIDO_POSIZIONE_INOLTRO.toString());
				this.erroriValidazione.add(ecc);
			}
		}

		// ConfermaRicezione...
		if(confermaRicezione == null ){
			// Default: false
			confermaRicezione = "false";
		}else{
			if( (confermaRicezione.equals("true") == false ) &&
					(confermaRicezione.equals("false") == false )  ){
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				ecc.setCodiceEccezione(CodiceErroreCooperazione.PROFILO_TRASMISSIONE_CONFERMA_RICEZIONE_SCONOSCIUTO);
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_PROFILO_TRASMISSIONE_NON_VALIDO_POSIZIONE_CONFERMA_RICEZIONE.toString());
				this.erroriValidazione.add(ecc);
			}
		}

		// set
		this.busta.setInoltro(toInoltro(inoltro), inoltro);
		if(confermaRicezione.equals("true"))
			this.busta.setConfermaRicezione(true);
		else
			this.busta.setConfermaRicezione(false);

	}

	/**
	 * Metodo che si occupa di validare l'elemento 'Sequenza' <var>child</var> secondo specifica eGov.
	 * <p>
	 * Il metodo, oltre ad effettuare la validazione, si occupa anche di leggerne il contenuto e 
	 * di impostarlo all'interno dell'oggetto <var>busta</var>.
	 * Mano mano che sono incontrati errori di validazione, viene creato un oggetto 
	 *    {@link Eccezione}, e viene inserito in errors.
	 *
	 * @param child nodo su cui effettuare la validazione
	 * @throws ProtocolException 
	 * 
	 */
	private void validazioneSequenza(OpenSPCoop2MessageFactory messageFactory, Node child,String prefix) throws StrutturaBustaException, ProtocolException{

		//log.info("Validazione sequenza...");

		if (SoapUtils.getNotEmptyChildNodes(messageFactory, child).size() != 0){
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.CONSEGNA_IN_ORDINE_NON_VALIDA);
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_SEQUENZA_NON_VALIDA_POSIZIONE.toString());
			this.erroriValidazione.add(ecc);
		}
		String seq = null;
		try{
			Node hrefFind = null;
			if(this.readQualifiedAttribute){
				hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, child, "numeroProgressivo", SPCoopCostanti.NAMESPACE_EGOV);
			}else{
				hrefFind = SoapUtils.getAttributeNode(messageFactory, child, "numeroProgressivo");
			}
			seq = hrefFind.getNodeValue();
			//log.info("Sequenza ["+seq+"]");
		} catch(Exception e) {
			// ignore
		}

		if(seq == null ){
			if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
				throw new StrutturaBustaException("Header egov senza elemento Sequenza numeroProgressivo","SequenzaNumeroProgressivo");
			} else {
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				ecc.setCodiceEccezione(CodiceErroreCooperazione.CONSEGNA_IN_ORDINE_NON_VALORIZZATA);
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_SEQUENZA_NON_VALIDA_POSIZIONE_NUMERO_PROGRESSIVO.toString());
				this.erroriValidazione.add(ecc);
				return;
			}
		}

		try{
			Long test = Long.valueOf(seq);
			this.busta.setSequenza(test.longValue());
		} catch(Exception e) {
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.CONSEGNA_IN_ORDINE_NON_VALIDA);
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_SEQUENZA_NON_VALIDA_POSIZIONE_NUMERO_PROGRESSIVO.toString());
			this.erroriValidazione.add(ecc);
		}


	}

	/**
	 * Metodo che si occupa di validare la lista Riscontri <var>child</var> secondo specifica eGov.
	 * <p>
	 * Il metodo, oltre ad effettuare la validazione, si occupa anche di leggerne il contenuto e 
	 * di impostarlo all'interno dell'oggetto <var>busta</var>.
	 * Mano mano che sono incontrati errori di validazione, viene creato un oggetto 
	 *    {@link Eccezione}, e viene inserito in errors.
	 *
	 * @param child nodo su cui effettuare la validazione
	 * @throws ProtocolException 
	 * 
	 */
	private void validazioneListaRiscontri(OpenSPCoop2MessageFactory messageFactory, Node child,String prefix) throws StrutturaBustaException, ProtocolException{

		//log.info("Validazione Lista Riscontri...");
		List<Node> riscontri = SoapUtils.getNotEmptyChildNodes(messageFactory, child);

		if(riscontri.size() <= 0 ){		   
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.LISTA_RISCONTRI_NON_VALORIZZATA);
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_RISCONTRI_NON_VALIDA_POSIZIONE_RISCONTRO.toString());
			this.erroriValidazione.add(ecc);
			return;
		}
		
		for(int i=0; i<riscontri.size();i++){

			boolean errorFind = false;

			Node riscontro = riscontri.get(i);
			//log.info("esamino["+child.getNodeName()+"]");
			//if(!(riscontro.getNodeName().equals(xmlns+"Riscontro"))){
			if(!(SoapUtils.matchLocalName(messageFactory, riscontro, "Riscontro", prefix, SPCoopCostanti.NAMESPACE_EGOV))){
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				ecc.setCodiceEccezione(CodiceErroreCooperazione.RISCONTRO_NON_VALIDO);
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_RISCONTRI_NON_VALIDA_POSIZIONE+"/childNode["+riscontro.getNodeName()+"]");
				this.erroriValidazione.add(ecc);
				continue;
			}

			List<Node> childsRiscontro = SoapUtils.getNotEmptyChildNodes(messageFactory, riscontro);
			/*if(childsRiscontro.getLength() != 2){		   
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(Costanti.CONTESTO_CODIFICA_ECCEZIONE_VALIDAZIONE);
				ecc.setCodiceEccezione(Costanti.ECCEZIONE_LISTA_RISCONTRI_NON_VALIDA);
				ecc.setRilevanza(LivelloRilevanza.GRAVE);
				ecc.setDescrizione(Costanti.ECCEZIONE_LISTA_RISCONTRI_NON_VALIDA_POSIZIONE_RISCONTRO+" child size:"+childsRiscontro.getLength());
				this.erroriValidazione.add(ecc);
				continue;
			}*/

			boolean presenzaIdentificatore = false;
			boolean presenzaOraRegistrazione = false;
			
			String id = null;
			boolean findID = false;
			String ora = null;
			Date oraDate = null;
			boolean findOra = false;
			String tipoOra = null;
			boolean findTipoOra = false;
			for(int j=0; j<childsRiscontro.size();j++){
				Node elem = childsRiscontro.get(j);
				//if(elem.getNodeName().equals(xmlns+"Identificatore")){
				if(SoapUtils.matchLocalName(messageFactory, elem, "Identificatore", prefix, SPCoopCostanti.NAMESPACE_EGOV)){
					
					if(presenzaIdentificatore){
						if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
							throw new StrutturaBustaException("Header egov con più di un elemento RiscontroIdentificatore","RiscontroIdentificatore");
						}else{
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.RISCONTRO_IDENTIFICATIVO_MESSAGGIO_PRESENTE_PIU_VOLTE);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							if(this.segnalazioneElementoPresentePiuVolte)
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_RISCONTRI_NON_VALIDA_POSIZIONE_RISCONTRO_IDENTIFICATORE+" "+CostantiProtocollo.ECCEZIONE_ELEMENTO_PRESENTE_PIU_VOLTE);
							else
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_RISCONTRI_NON_VALIDA_POSIZIONE_RISCONTRO_IDENTIFICATORE.toString());
							this.erroriValidazione.add(ecc);
							continue;
						}
					}else{
					
						presenzaIdentificatore = true;
					
						try{
							id = SoapUtils.getNotEmptyChildNodes(messageFactory, elem).get(0).getNodeValue();
							findID = true;
						} catch(Exception e) {
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.RISCONTRO_IDENTIFICATIVO_MESSAGGIO_NON_VALIDO);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_RISCONTRI_NON_VALIDA_POSIZIONE_RISCONTRO_IDENTIFICATORE.toString());
							this.erroriValidazione.add(ecc);
							errorFind = true;
						}
					}
				//}else if(elem.getNodeName().equals(xmlns+"OraRegistrazione")){
				}else if(SoapUtils.matchLocalName(messageFactory, elem, "OraRegistrazione", prefix, SPCoopCostanti.NAMESPACE_EGOV)){
					if(presenzaOraRegistrazione){
						if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
							throw new StrutturaBustaException("Header egov con più di un elemento RiscontroOraRegistrazione","RiscontroOraRegistrazione");
						}else{
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.RISCONTRO_ORA_REGISTRAZIONE_PRESENTE_PIU_VOLTE);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							if(this.segnalazioneElementoPresentePiuVolte)
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_RISCONTRI_NON_VALIDA_POSIZIONE_RISCONTRO_ORA_REGISTRAZIONE+" "+CostantiProtocollo.ECCEZIONE_ELEMENTO_PRESENTE_PIU_VOLTE);
							else
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_RISCONTRI_NON_VALIDA_POSIZIONE_RISCONTRO_ORA_REGISTRAZIONE.toString());
							this.erroriValidazione.add(ecc);
							continue;
						}
					}else{
						presenzaOraRegistrazione = true;
					
						try{
							ora = SoapUtils.getNotEmptyChildNodes(messageFactory, elem).get(0).getNodeValue();
							findOra = true;
						} catch(Exception e) {
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.RISCONTRO_ORA_REGISTRAZIONE_NON_VALIDA);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_RISCONTRI_NON_VALIDA_POSIZIONE_RISCONTRO_ORA_REGISTRAZIONE.toString());
							this.erroriValidazione.add(ecc);
							errorFind = true;
						}
						oraDate = null;
						if(ora!=null){
							oraDate = validazioneData(ora);
						}
						if( (ora == null) || (oraDate==null)){
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.RISCONTRO_ORA_REGISTRAZIONE_NON_VALIDA);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_RISCONTRI_NON_VALIDA_POSIZIONE_RISCONTRO_ORA_REGISTRAZIONE.toString());
							this.erroriValidazione.add(ecc);
							errorFind = true;
						}
	
						// tempo ...
						try{
							Node hrefFind = null;
							if(this.readQualifiedAttribute){
								hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, elem, "tempo", SPCoopCostanti.NAMESPACE_EGOV);
							}else{
								hrefFind = SoapUtils.getAttributeNode(messageFactory, elem, "tempo");
							}
							tipoOra = hrefFind.getNodeValue();
							findTipoOra = true;
						} catch(Exception e) {
							if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
								throw new StrutturaBustaException("Header egov senza RiscontroOraRegistrazioneTempo","RiscontroOraRegistrazioneTempo");
							}else{
								Eccezione ecc = new Eccezione();
								ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
								ecc.setCodiceEccezione(CodiceErroreCooperazione.RISCONTRO_TIPO_ORA_REGISTRAZIONE_NON_VALIDO);
								ecc.setRilevanza(LivelloRilevanza.ERROR);
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_RISCONTRI_NON_VALIDA_POSIZIONE_RISCONTRO_ORA_REGISTRAZIONE_TEMPO.toString());
								this.erroriValidazione.add(ecc);
								errorFind = true;
							}
						}
						if(tipoOra!=null){
							if(!tipoOra.equals(SPCoopCostanti.TIPO_TEMPO_LOCALE) && !tipoOra.equals(SPCoopCostanti.TIPO_TEMPO_SPC)){
								Eccezione ecc = new Eccezione();
								ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
								ecc.setCodiceEccezione(CodiceErroreCooperazione.RISCONTRO_TIPO_ORA_REGISTRAZIONE_SCONOSCIUTO);
								ecc.setRilevanza(LivelloRilevanza.ERROR);
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_RISCONTRI_NON_VALIDA_POSIZIONE_RISCONTRO_ORA_REGISTRAZIONE_TEMPO.toString());
								this.erroriValidazione.add(ecc);
								errorFind = true;
							}
						}
					}
				}else {
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.LISTA_RISCONTRI_NON_VALIDA);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_RISCONTRI_NON_VALIDA_POSIZIONE_RISCONTRO+"/child["+elem.getNodeName()+"]");
					this.erroriValidazione.add(ecc);
					errorFind = true;
				}
			}

			if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
				if(presenzaIdentificatore == false){
					throw new StrutturaBustaException("Header egov senza RiscontroIdentificatore","RiscontroIdentificatore");
				}
				if(presenzaOraRegistrazione == false){
					throw new StrutturaBustaException("Header egov senza RiscontroOraRegistrazione","RiscontroOraRegistrazione");
				}
			}
			
			if(errorFind==false){
				if(findID != true){
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.RISCONTRO_IDENTIFICATIVO_MESSAGGIO_NON_PRESENTE);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_RISCONTRI_NON_VALIDA_POSIZIONE_RISCONTRO_IDENTIFICATORE.toString());
					this.erroriValidazione.add(ecc);
				}
				if(findOra != true){
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.RISCONTRO_ORA_REGISTRAZIONE_NON_PRESENTE);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_RISCONTRI_NON_VALIDA_POSIZIONE_RISCONTRO_ORA_REGISTRAZIONE.toString());
					this.erroriValidazione.add(ecc);
				}else{
					if(findTipoOra != true){
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						ecc.setCodiceEccezione(CodiceErroreCooperazione.RISCONTRO_TIPO_ORA_REGISTRAZIONE_NON_PRESENTE);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_RISCONTRI_NON_VALIDA_POSIZIONE_RISCONTRO_ORA_REGISTRAZIONE_TEMPO.toString());
						this.erroriValidazione.add(ecc);
					}
				}
			}
			

			//if(id!=null && ora!=null && tipoOra !=null) {
			if(id!=null || ora!=null || tipoOra !=null) {
				Riscontro r = new Riscontro();
				r.setID(id);		
				//log.info("ORA REC["+oraDate+"]");
				r.setOraRegistrazione(oraDate);
				r.setTipoOraRegistrazioneValue(tipoOra);
				r.setTipoOraRegistrazione(this.traduttore.toTipoOraRegistrazione(tipoOra));
				this.busta.addRiscontro(r);
			}
		}

	}


	/**
	 * Metodo che si occupa di validare la lista Trasmissioni <var>child</var> secondo specifica eGov.
	 * <p>
	 * Il metodo, oltre ad effettuare la validazione, si occupa anche di leggerne il contenuto e 
	 * di impostarlo all'interno dell'oggetto <var>busta</var>.
	 * Mano mano che sono incontrati errori di validazione, viene creato un oggetto 
	 *    {@link Eccezione}, e viene inserito in errors.
	 *
	 * @param child nodo su cui effettuare la validazione
	 * @throws ProtocolException 
	 * 
	 */
	private void validazioneListaTrasmissioni(OpenSPCoop2MessageFactory messageFactory, Node child,String prefix) throws StrutturaBustaException, ProtocolException{
		
		//	log.info("Validazione Lista Trasmissioni...");
		List<Node> trasmissioni = SoapUtils.getNotEmptyChildNodes(messageFactory, child);

		if(trasmissioni.size()<=0){
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.LISTA_TRASMISSIONI_NON_VALORIZZATA);
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE.toString());
			this.erroriValidazione.add(ecc);
			return;
		}
		
		for(int i=0; i<trasmissioni.size();i++){

			boolean errorFind = false;

			Node trasmissione = trasmissioni.get(i);
			//log.info("esamino["+child.getNodeName()+"]");
			//if(!(trasmissione.getNodeName().equals(xmlns+"Trasmissione"))){
			if(!(SoapUtils.matchLocalName(messageFactory, trasmissione, "Trasmissione", prefix, SPCoopCostanti.NAMESPACE_EGOV))){
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_NON_PRESENTE);
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE+"/child["+trasmissione.getNodeName()+"]");
				this.erroriValidazione.add(ecc);
				continue;
			}
			List<Node> childsTrasmissione = SoapUtils.getNotEmptyChildNodes(messageFactory, trasmissione);
			/*if(childsTrasmissione.getLength() != 3){		   
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(Costanti.CONTESTO_CODIFICA_ECCEZIONE_VALIDAZIONE);
				ecc.setCodiceEccezione(Costanti.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA);
				ecc.setRilevanza(LivelloRilevanza.GRAVE);
				ecc.setDescrizione(Costanti.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE+" child size:"+childsTrasmissione.getLength());
				this.erroriValidazione.add(ecc);
				continue;
			}*/

			boolean presenzaOrigine = false;
			boolean presenzaDestinazione = false;
			boolean presenzaOraRegistrazione = false;
			
			String origine = null;
			String tipoOrigine = null;
			String indTelematicoOrigine = null;
			boolean findOrigine = false;
			boolean findTipoOrigine = false;
			String destinazione = null;
			String tipoDestinazione = null;
			String indTelematicoDestinazione = null;
			boolean findDestinazione = false;
			boolean findTipoDestinazione = false;
			String ora = null;
			Date oraDate = null;
			boolean findOra = false;
			String tipoOra = null;
			boolean findTipoOra = false;
			for(int j=0; j<childsTrasmissione.size();j++){
				Node elem = childsTrasmissione.get(j);

				//if(elem.getNodeName().equals(xmlns+"Origine")){
				if(SoapUtils.matchLocalName(messageFactory, elem, "Origine", prefix, SPCoopCostanti.NAMESPACE_EGOV)){
					
					if(presenzaOrigine){
						if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
							throw new StrutturaBustaException("Header egov con più di un elemento TrasmissioneOrigine","TrasmissioneOrigine");
						}else{
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_ORIGINE_PRESENTE_PIU_VOLTE);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							if(this.segnalazioneElementoPresentePiuVolte)
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORIGINE+" "+CostantiProtocollo.ECCEZIONE_ELEMENTO_PRESENTE_PIU_VOLTE);
							else
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORIGINE.toString());
							this.erroriValidazione.add(ecc);
							continue;
						}
					}else{
					
						presenzaOrigine = true;
						
						if(SoapUtils.getNotEmptyChildNodes(messageFactory, elem).size() != 1){ 
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_ORIGINE_NON_PRESENTE);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							if(SoapUtils.getNotEmptyChildNodes(messageFactory, elem).size() < 1){ 
								if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
									throw new StrutturaBustaException("Header egov senza TrasmissioneOrigine IdentificativoParte","TrasmissioneOrigineIdentificativoParte");
								}else{
									ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORIGINE_IDENTIFICATIVO_PARTE.toString());
								}
							}else{
								if(this.segnalazioneElementoPresentePiuVolte)
									ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORIGINE_IDENTIFICATIVO_PARTE+" "+CostantiProtocollo.ECCEZIONE_ELEMENTO_PRESENTE_PIU_VOLTE);
								else
									ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORIGINE_IDENTIFICATIVO_PARTE.toString());
							}
							this.erroriValidazione.add(ecc);
							errorFind = true;
							continue;
						}
						Node idParte = SoapUtils.getNotEmptyChildNodes(messageFactory, elem).get(0);
						try{ 
							List<Node> valueIDParte = SoapUtils.getNotEmptyChildNodes(messageFactory, idParte);
							origine =  valueIDParte.get(0).getNodeValue();
							findOrigine = true;
						} catch(Exception e) {
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_ORIGINE_NON_VALIDA);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORIGINE_IDENTIFICATIVO_PARTE.toString());
							this.erroriValidazione.add(ecc);
							errorFind = true;
						}
						try{ 
							Node hrefFind = null;
							if(this.readQualifiedAttribute){
								hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, idParte, "tipo", SPCoopCostanti.NAMESPACE_EGOV);
							}else{
								hrefFind = SoapUtils.getAttributeNode(messageFactory, idParte, "tipo");
							}
							tipoOrigine = hrefFind.getNodeValue();
							
							// Controllo tipo
							if(tipoOrigine==null){
								if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
									if(findTipoOrigine==false){
										throw new StrutturaBustaException("Header egov senza TrasmissioneOrigine IdentificativoParteTipo","TrasmissioneOrigineIdentificativoParteTipo");
									}
								}else{
									throw new Exception("Tipo non definito");
								}
							}
							try {
								tipoOrigine = this.traduttore.toRegistryOrganizationType(tipoOrigine);
							}catch(Exception e) {
								this.log.warn(e.getMessage(),e);
								throw new Exception("Tipo non valido");
							}
							
							findTipoOrigine = true;
						} catch (StrutturaBustaException se){
							throw se;
						} catch(Exception e) {
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_TIPO_ORIGINE_NON_VALIDA);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORIGINE_IDENTIFICATIVO_PARTE_TIPO.toString());
							this.erroriValidazione.add(ecc);
							errorFind = true;
						}
	
						// indirizzo Telematico
						try{
							Node hrefFindT = null;
							if(this.readQualifiedAttribute){
								hrefFindT = SoapUtils.getQualifiedAttributeNode(messageFactory, idParte, "indirizzoTelematico", SPCoopCostanti.NAMESPACE_EGOV);
							}else{
								hrefFindT = SoapUtils.getAttributeNode(messageFactory, idParte, "indirizzoTelematico");
							}
							if(hrefFindT != null)
								indTelematicoOrigine = hrefFindT.getNodeValue();
							//log.info("IndirizzoTelematicoOrigine ["+indTelematico+"]");
						} catch(Exception e) {
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_INDIRIZZO_ORIGINE_NON_VALIDA);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORIGINE_IDENTIFICATIVO_PARTE_IND_TELEMATICO.toString());
							this.erroriValidazione.add(ecc);
							errorFind = true;
						}
						if(errorFind==false && indTelematicoOrigine != null && (indTelematicoOrigine.equals("")==false)){ 
							URL urlcheck = null;
							try{	
								urlcheck = new URL( indTelematicoOrigine );
								indTelematicoOrigine = urlcheck.toString();
							} catch(Exception e) {
								Eccezione ecc = new Eccezione();
								ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
								ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_INDIRIZZO_ORIGINE_NON_VALIDA);
								ecc.setRilevanza(LivelloRilevanza.ERROR);
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORIGINE_IDENTIFICATIVO_PARTE_IND_TELEMATICO.toString());
								this.erroriValidazione.add(ecc);
								errorFind = true;
							}
						}
					}

				//}else if(elem.getNodeName().equals(xmlns+"Destinazione")){
				}else if(SoapUtils.matchLocalName(messageFactory, elem, "Destinazione", prefix, SPCoopCostanti.NAMESPACE_EGOV)){

					if(presenzaDestinazione){
						if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
							throw new StrutturaBustaException("Header egov con più di un elemento TrasmissioneDestinazione","TrasmissioneDestinazione");
						}else{
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_DESTINAZIONE_PRESENTE_PIU_VOLTE);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							if(this.segnalazioneElementoPresentePiuVolte)
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_DESTINAZIONE+" "+CostantiProtocollo.ECCEZIONE_ELEMENTO_PRESENTE_PIU_VOLTE);
							else
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_DESTINAZIONE.toString());
							this.erroriValidazione.add(ecc);
							continue;
						}
					}else{
					
						presenzaDestinazione = true;
					
						if(SoapUtils.getNotEmptyChildNodes(messageFactory, elem).size() != 1){ 
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_DESTINAZIONE_NON_VALIDA);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							if(SoapUtils.getNotEmptyChildNodes(messageFactory, elem).size() < 1){ 
								if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
									throw new StrutturaBustaException("Header egov senza TrasmissioneDestinazione IdentificativoParte","TrasmissioneDestinazioneIdentificativoParte");
								}else{
									ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_DESTINAZIONE_IDENTIFICATIVO_PARTE.toString());
								}
							}else{
								if(this.segnalazioneElementoPresentePiuVolte)
									ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_DESTINAZIONE_IDENTIFICATIVO_PARTE+" "+CostantiProtocollo.ECCEZIONE_ELEMENTO_PRESENTE_PIU_VOLTE);
								else
									ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_DESTINAZIONE_IDENTIFICATIVO_PARTE.toString());
							}
							this.erroriValidazione.add(ecc);
							errorFind = true;
							continue;
						}
						Node idParte = SoapUtils.getNotEmptyChildNodes(messageFactory, elem).get(0);
						try{ 
							List<Node> valueIDParte = SoapUtils.getNotEmptyChildNodes(messageFactory, idParte);
							destinazione =  valueIDParte.get(0).getNodeValue();
							findDestinazione = true;
						} catch(Exception e) {
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_DESTINAZIONE_NON_VALIDA);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_DESTINAZIONE_IDENTIFICATIVO_PARTE.toString());
							this.erroriValidazione.add(ecc);
							errorFind = true;
						}
						try{ 
							Node hrefFind = null;
							if(this.readQualifiedAttribute){
								hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, idParte, "tipo", SPCoopCostanti.NAMESPACE_EGOV);
							}else{
								hrefFind = SoapUtils.getAttributeNode(messageFactory, idParte, "tipo");
							}
							tipoDestinazione = hrefFind.getNodeValue();
							
							// Controllo tipo
							if(tipoDestinazione==null){
								if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
									if(findTipoOrigine==false){
										throw new StrutturaBustaException("Header egov senza TrasmissioneDestinazione IdentificativoParteTipo","TrasmissioneDestinazioneIdentificativoParteTipo");
									}
								}else{
									throw new Exception("Tipo non definito");
								}
							}
							try {
								tipoDestinazione = this.traduttore.toRegistryOrganizationType(tipoDestinazione);
							}catch(Exception e) {
								this.log.warn(e.getMessage(),e);
								throw new Exception("Tipo non valido");
							}
							
							findTipoDestinazione = true;
						} catch (StrutturaBustaException se){
							throw se;
						} catch(Exception e) {
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_TIPO_DESTINAZIONE_NON_VALIDA);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_DESTINAZIONE_IDENTIFICATIVO_PARTE_TIPO.toString());
							this.erroriValidazione.add(ecc);
							errorFind = true;
						}
	
						// indirizzo Telematico
						try{
							Node hrefFindT = null;
							if(this.readQualifiedAttribute){
								hrefFindT = SoapUtils.getQualifiedAttributeNode(messageFactory, idParte, "indirizzoTelematico", SPCoopCostanti.NAMESPACE_EGOV);
							}else{
								hrefFindT = SoapUtils.getAttributeNode(messageFactory, idParte, "indirizzoTelematico");
							}
							if(hrefFindT != null)
								indTelematicoDestinazione = hrefFindT.getNodeValue();
							//log.info("IndirizzoTelematicoDestinazione ["+indTelematico+"]");
						} catch(Exception e) {
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_INDIRIZZO_DESTINAZIONE_NON_VALIDA);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_DESTINAZIONE_IDENTIFICATIVO_PARTE_IND_TELEMATICO.toString());
							this.erroriValidazione.add(ecc);
							errorFind = true;
						}
						if(errorFind==false && indTelematicoDestinazione != null && (indTelematicoDestinazione.equals("")==false)){ 
							URL urlcheck = null;
							try{	
								urlcheck = new URL( indTelematicoDestinazione );
								indTelematicoDestinazione = urlcheck.toString();
							} catch(Exception e) {
								Eccezione ecc = new Eccezione();
								ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
								ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_INDIRIZZO_DESTINAZIONE_NON_VALIDA);
								ecc.setRilevanza(LivelloRilevanza.ERROR);
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_DESTINAZIONE_IDENTIFICATIVO_PARTE_IND_TELEMATICO.toString());
								this.erroriValidazione.add(ecc);
								errorFind = true;
							}
						}
					}

				//}else if(elem.getNodeName().equals(xmlns+"OraRegistrazione")){
				}else if(SoapUtils.matchLocalName(messageFactory, elem, "OraRegistrazione", prefix, SPCoopCostanti.NAMESPACE_EGOV)){

					if(presenzaOraRegistrazione){
						if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
							throw new StrutturaBustaException("Header egov con più di un elemento TrasmissioneOraRegistrazione","TrasmissioneOraRegistrazione");
						}else{
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_ORA_REGISTRAZIONE_PRESENTE_PIU_VOLTE);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							if(this.segnalazioneElementoPresentePiuVolte)
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORA_REGISTRAZIONE+" "+CostantiProtocollo.ECCEZIONE_ELEMENTO_PRESENTE_PIU_VOLTE);
							else
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORA_REGISTRAZIONE.toString());
							this.erroriValidazione.add(ecc);
							continue;
						}
					}else{
					
						presenzaOraRegistrazione = true;
					
						// ora ...
						try{
							ora = SoapUtils.getNotEmptyChildNodes(messageFactory, elem).get(0).getNodeValue();
							findOra = true;
						} catch(Exception e) {
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_ORA_REGISTRAZIONE_NON_VALIDA);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORA_REGISTRAZIONE.toString());
							this.erroriValidazione.add(ecc);
							errorFind = true;
						}
						oraDate = null;
						if(ora != null)
							oraDate = validazioneData(ora);
						if( (ora == null) || (oraDate == null)){
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_ORA_REGISTRAZIONE_NON_VALIDA);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORA_REGISTRAZIONE.toString());
							this.erroriValidazione.add(ecc);
							errorFind = true;
						}
	
						// tempo ...
						try{
							Node hrefFind = null;
							if(this.readQualifiedAttribute){
								hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, elem, "tempo", SPCoopCostanti.NAMESPACE_EGOV);
							}else{
								hrefFind = SoapUtils.getAttributeNode(messageFactory, elem, "tempo");
							}
							tipoOra = hrefFind.getNodeValue();
							findTipoOra = true;
						} catch(Exception e) {
							if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
								if(findTipoOrigine==false){
									throw new StrutturaBustaException("Header egov senza Trasmissione OraRegistrazioneTempo","TrasmissioneOraRegistrazioneTempo");
								}
							}else{
								Eccezione ecc = new Eccezione();
								ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
								ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_TIPO_ORA_REGISTRAZIONE_NON_VALIDA);
								ecc.setRilevanza(LivelloRilevanza.ERROR);
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORA_REGISTRAZIONE_TEMPO.toString());
								this.erroriValidazione.add(ecc);
								errorFind = true;
							}
						}
						if(tipoOra!=null){
							if(!tipoOra.equals(SPCoopCostanti.TIPO_TEMPO_LOCALE) && !tipoOra.equals(SPCoopCostanti.TIPO_TEMPO_SPC)){
								Eccezione ecc = new Eccezione();
								ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
								ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_TIPO_ORA_REGISTRAZIONE_SCONOSCIUTA);
								ecc.setRilevanza(LivelloRilevanza.ERROR);
								ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORA_REGISTRAZIONE_TEMPO.toString());
								this.erroriValidazione.add(ecc);
								errorFind = true;
							}
						}
					}
				}else {
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.LISTA_TRASMISSIONI_NON_VALIDA);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE+"/child["+elem.getNodeName()+"]");
					this.erroriValidazione.add(ecc);
					errorFind = true;
				}

			}
			
			
			// Check elementi principali
			if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
				if(presenzaOrigine==false){
					throw new StrutturaBustaException("Header egov senza TrasmissioneOrigine","TrasmissioneOrigine");
				}
				if(presenzaDestinazione==false){
					throw new StrutturaBustaException("Header egov senza TrasmissioneDestinazione","TrasmissioneDestinazione");
				}
				if(presenzaOraRegistrazione==false){
					throw new StrutturaBustaException("Header egov senza TrasmissioneOraRegistrazione","TrasmissioneOraRegistrazione");
				}
			}
			
			if(errorFind == false){
				if(presenzaOrigine==false){
					errorFind = true;
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_ORIGINE_NON_PRESENTE);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORIGINE.toString());
					this.erroriValidazione.add(ecc);
				}
				if(presenzaDestinazione==false){
					errorFind = true;
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_DESTINAZIONE_NON_PRESENTE);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_DESTINAZIONE.toString());
					this.erroriValidazione.add(ecc);
				}
				if(presenzaOraRegistrazione==false){
					errorFind = true;
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_ORA_REGISTRAZIONE_NON_PRESENTE);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORA_REGISTRAZIONE.toString());
					this.erroriValidazione.add(ecc);
				}
			}
			
			if(errorFind == false){
				if(findOrigine != true){
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_ORIGINE_NON_PRESENTE);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORIGINE_IDENTIFICATIVO_PARTE.toString());
					this.erroriValidazione.add(ecc);
				}else{
					if(findTipoOrigine != true){
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_TIPO_ORIGINE_NON_PRESENTE);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORIGINE_IDENTIFICATIVO_PARTE_TIPO.toString());
						this.erroriValidazione.add(ecc);
					}
				}
				if(findDestinazione != true){
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_DESTINAZIONE_NON_PRESENTE);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_DESTINAZIONE_IDENTIFICATIVO_PARTE.toString());
					this.erroriValidazione.add(ecc);
				}else{
					if(findTipoDestinazione != true){
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_TIPO_DESTINAZIONE_NON_PRESENTE);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_DESTINAZIONE_IDENTIFICATIVO_PARTE_TIPO.toString());
						this.erroriValidazione.add(ecc);
					}
				}
				if(findOra != true){
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_ORA_REGISTRAZIONE_NON_PRESENTE);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORA_REGISTRAZIONE.toString());
					this.erroriValidazione.add(ecc);
				}else{
					if(findTipoOra != true){
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_TIPO_ORA_REGISTRAZIONE_NON_PRESENTE);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORA_REGISTRAZIONE_TEMPO.toString());
						this.erroriValidazione.add(ecc);
					}
				}
			}
			
			//if(origine!=null && tipoOrigine!=null && tipoDestinazione!=null && destinazione!=null && 
			//		ora!=null && tipoOra != null) {
			if(origine!=null || tipoOrigine!=null || tipoDestinazione!=null || destinazione!=null || 
					ora!=null || tipoOra != null) {
				//log.info("add Trasmissione....");
				Trasmissione tr = new Trasmissione();
				tr.setOrigine(origine);
				tr.setTipoOrigine(tipoOrigine);
				tr.setIndirizzoOrigine(indTelematicoOrigine);
				tr.setDestinazione(destinazione);
				tr.setTipoDestinazione(tipoDestinazione);
				tr.setIndirizzoDestinazione(indTelematicoDestinazione);
				//log.info("ORA REC["+oraDate+"]");
				tr.setOraRegistrazione(oraDate);
				tr.setTempoValue(tipoOra);
				tr.setTempo(this.traduttore.toTipoOraRegistrazione(tipoOra));
				this.busta.addTrasmissione(tr);
			}
		}

	}

	/**
	 * Metodo che si occupa di validare la lista Eccezioni <var>child</var> secondo specifica eGov.
	 * <p>
	 * Il metodo, oltre ad effettuare la validazione, si occupa anche di leggerne il contenuto e 
	 * di impostarlo all'interno dell'oggetto <var>busta</var>.
	 * Mano mano che sono incontrati errori di validazione, viene creato un oggetto 
	 *    {@link Eccezione}, e viene inserito in un errorsEccezione.
	 *
	 * @param child nodo su cui effettuare la validazione
	 * @throws ProtocolException 
	 * 
	 */
	private void validazioneListaEccezioni(OpenSPCoop2MessageFactory messageFactory, Node child,String prefix) throws StrutturaBustaException, ProtocolException{

		//log.info("Validazione Lista Eccezioni...");
		List<Node> eccezioni = SoapUtils.getNotEmptyChildNodes(messageFactory, child);

		for(int i=0; i<eccezioni.size();i++){

			boolean errorFind = false;

			Node eccezione = eccezioni.get(i);
			//log.info("esamino["+child.getNodeName()+"]");
			//if(!(eccezione.getNodeName().equals(xmlns+"Eccezione"))){
			if(!(SoapUtils.matchLocalName(messageFactory, eccezione, "Eccezione", prefix, SPCoopCostanti.NAMESPACE_EGOV))){
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				ecc.setCodiceEccezione(CodiceErroreCooperazione.INTESTAZIONE_NON_CORRETTA);
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_ECCEZIONI_NON_VALIDA_POSIZIONE+"/child["+eccezione.getNodeName()+"]");
				this.errorsTrovatiSullaListaEccezioni.add(ecc);
				errorFind = true;
			}

			String contestoCodifica = null;
			String codiceEccezione = null;
			String rilevanza = null;
			String posizione = null;
			

			// ContestoCodifica
			boolean contestoCodificaError = false;
			try{
				Node hrefFind = null;
				if(this.readQualifiedAttribute){
					hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, eccezione, "contestoCodifica", SPCoopCostanti.NAMESPACE_EGOV);
				}else{
					hrefFind = SoapUtils.getAttributeNode(messageFactory, eccezione, "contestoCodifica");
				}
				contestoCodifica = hrefFind.getNodeValue();
			} catch(Exception e) {
				contestoCodificaError = true;
			}
			if(contestoCodifica == null)
				contestoCodificaError = true;
			if(contestoCodificaError){
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				ecc.setCodiceEccezione(CodiceErroreCooperazione.INTESTAZIONE_NON_CORRETTA);
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_ECCEZIONI_NON_VALIDA_POSIZIONE_CONTESTO_CODIFICA.toString());
				this.errorsTrovatiSullaListaEccezioni.add(ecc);
				errorFind = true;
			}

			// codiceEccezione
			boolean codiceEccezioneError = false;
			try{
				Node hrefFind = null;
				if(this.readQualifiedAttribute){
					hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, eccezione, "codiceEccezione", SPCoopCostanti.NAMESPACE_EGOV);
				}else{
					hrefFind = SoapUtils.getAttributeNode(messageFactory, eccezione, "codiceEccezione");
				}
				codiceEccezione = hrefFind.getNodeValue();
			} catch(Exception e) {
				codiceEccezioneError = true;
			}
			if(validazioneCodiceEccezione(codiceEccezione) == false)
				codiceEccezioneError = true;
			if(codiceEccezioneError){
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				ecc.setCodiceEccezione(CodiceErroreCooperazione.INTESTAZIONE_NON_CORRETTA);
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_ECCEZIONI_NON_VALIDA_POSIZIONE_CODICE_ECCEZIONE.toString());
				this.errorsTrovatiSullaListaEccezioni.add(ecc);
				errorFind = true;
			}

			// Rilevanza
			boolean rilevanzaError = false;
			try{
				Node hrefFind = null;
				if(this.readQualifiedAttribute){
					hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, eccezione, "rilevanza", SPCoopCostanti.NAMESPACE_EGOV);
				}else{
					hrefFind = SoapUtils.getAttributeNode(messageFactory, eccezione, "rilevanza");
				}
				rilevanza = hrefFind.getNodeValue();
			} catch(Exception e) {
				rilevanzaError = true;
			}
			LivelloRilevanza livRilevanza = validazioneRilevanza(rilevanza);
			if(livRilevanza.equals(LivelloRilevanza.UNKNOWN))
				rilevanzaError = true;
			if(rilevanzaError){
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				ecc.setCodiceEccezione(CodiceErroreCooperazione.INTESTAZIONE_NON_CORRETTA);
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_ECCEZIONI_NON_VALIDA_POSIZIONE_RILEVANZA.toString());
				this.errorsTrovatiSullaListaEccezioni.add(ecc);
				errorFind = true;
			}

			// Posizione
			boolean posizioneError = false;
			try{
				Node hrefFind = null;
				if(this.readQualifiedAttribute){
					hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, eccezione, "posizione", SPCoopCostanti.NAMESPACE_EGOV);
				}else{
					hrefFind = SoapUtils.getAttributeNode(messageFactory, eccezione, "posizione");
				}
				posizione = hrefFind.getNodeValue();
			} catch(Exception e) {
				posizioneError = true;
			}
			if(posizione == null)
				posizioneError = true;
			if(posizioneError){
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				ecc.setCodiceEccezione(CodiceErroreCooperazione.INTESTAZIONE_NON_CORRETTA);
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_ECCEZIONI_NON_VALIDA_POSIZIONE_POSIZIONE.toString());
				this.errorsTrovatiSullaListaEccezioni.add(ecc);
				errorFind = true;
			}

			if(this.spcoopProperties.isGenerazioneBustaErrore_strutturaMalformataHeaderProtocollo()==false){
				if(contestoCodifica == null){
					throw new StrutturaBustaException("Header egov senza Eccezione contestoCodifica","EccezioneContestoCodifica");
				}
				if(codiceEccezione == null){
					throw new StrutturaBustaException("Header egov senza Eccezione codiceEccezione","EccezioneCodiceEccezione");
				}
				if(rilevanza == null){
					throw new StrutturaBustaException("Header egov senza Eccezione rilevanza","EccezioneRilevanza");
				}
				if(posizione == null){
					throw new StrutturaBustaException("Header egov senza Eccezione posizione","EccezionePosizione");
				}
			}
			
			// Check finale
			if(errorFind == false){
				if(contestoCodifica == null){
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.INTESTAZIONE_NON_CORRETTA);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_ECCEZIONI_NON_VALIDA_POSIZIONE_CONTESTO_CODIFICA.toString());
					this.errorsTrovatiSullaListaEccezioni.add(ecc);
				}
				if(codiceEccezione == null){
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.INTESTAZIONE_NON_CORRETTA);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_ECCEZIONI_NON_VALIDA_POSIZIONE_CODICE_ECCEZIONE.toString());
					this.errorsTrovatiSullaListaEccezioni.add(ecc);
				}
				if(rilevanza == null){
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.INTESTAZIONE_NON_CORRETTA);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_ECCEZIONI_NON_VALIDA_POSIZIONE_RILEVANZA.toString());
					this.errorsTrovatiSullaListaEccezioni.add(ecc);
				}
				if(posizione == null){
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.INTESTAZIONE_NON_CORRETTA);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_ECCEZIONI_NON_VALIDA_POSIZIONE_POSIZIONE.toString());
					this.errorsTrovatiSullaListaEccezioni.add(ecc);
				}
			}
			
			if(contestoCodifica!=null && codiceEccezione!=null && rilevanza !=null && posizione!=null) {
				Eccezione eccLetta = new Eccezione();
				
				eccLetta.setContestoCodificaValue(contestoCodifica);
				eccLetta.setContestoCodifica(this.traduttore.toContestoCodificaEccezione(contestoCodifica));
				
				eccLetta.setCodiceEccezioneValue(codiceEccezione);
				eccLetta.setCodiceEccezione(this.traduttore.toCodiceErroreCooperazione(codiceEccezione));
								
				eccLetta.setRilevanza(livRilevanza);
				eccLetta.setRilevanzaValue(rilevanza);
				
				eccLetta.setDescrizione(posizione);
				
				this.busta.addEccezione(eccLetta);
			}
		}

	}

	/**
	 * Metodo che si occupa di validare un codice di rilevanza associato ad una Eccezione. 
	 *
	 * @param codice Codice della rilevanza da validare.
	 * @return true se il codice e' valido, false altrimenti
	 * @throws ProtocolException 
	 * 
	 */
	private LivelloRilevanza validazioneRilevanza(String codice) throws ProtocolException{
		return this.traduttore.toLivelloRilevanza(codice);
	}

	/**
	 * Metodo che si occupa di validare un codice di errore associato ad una Eccezione. 
	 *
	 * @param codice Codice dell'eccezione da validare.
	 * @return true se il codice e' valido, false altrimenti
	 * 
	 */

	public boolean validazioneCodiceEccezione(CodiceErroreCooperazione codice){
		String v = this.traduttore.toString(codice);
		return v!=null;
	}
	
	public boolean validazioneCodiceEccezione(String codicetxt) throws ProtocolException{
		CodiceErroreCooperazione codice = CodiceErroreCooperazione.toCodiceErroreCooperazione(this.protocolFactory, codicetxt);
		return validazioneCodiceEccezione(codice);
	}


	public void validazioneFaultEGov(OpenSPCoop2Message msg){

		try{
			SOAPBody body = msg.castAsSoap().getSOAPBody();
			
			//Traduttore trasl = this.protocolFactory.createTraduttore();

			//log.info("VALIDAZIONE FAULT");
			if(body.hasFault() == false){
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				ecc.setCodiceEccezione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO);
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_ECCEZIONI_NON_VALIDA_POSIZIONE_SOAP_FAULT.toString());
				this.errorsTrovatiSullaListaEccezioni.add(ecc);
			} else {
				SOAPFault fault = body.getFault();
				boolean valoriOK = true;

				// Controllo sul Fault
				String faultS = fault.getFaultString();
				if(faultS!=null)
					faultS = faultS.trim();
				if( !(SPCoopCostanti.FAULT_STRING_PROCESSAMENTO.equals(faultS)) && 
						!(SPCoopCostanti.FAULT_STRING_VALIDAZIONE.equals(faultS))  ){
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_ECCEZIONI_NON_VALIDA_POSIZIONE_SOAP_FAULT_STRING.toString());
					this.errorsTrovatiSullaListaEccezioni.add(ecc);
					valoriOK = false;
				}
				Name codeS = fault.getFaultCodeAsName();
				
				if( 
						(codeS == null) 
						||
						!(
								("Client".equals(codeS.getLocalName()) || "Server".equals(codeS.getLocalName()) ) && 
								Costanti.SOAP_ENVELOPE_NAMESPACE.equalsIgnoreCase(codeS.getURI()) 
						)
				)
				{
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_ECCEZIONI_NON_VALIDA_POSIZIONE_SOAP_FAULT_CODE.toString());
					this.errorsTrovatiSullaListaEccezioni.add(ecc);
					valoriOK = false;
				}
				if(valoriOK){
					if ("Client".equals(codeS.getLocalName()) ){
						boolean detailPresente = false;
						Detail d = fault.getDetail();
						if(d!=null){
							if(d.getDetailEntries().hasNext())
								detailPresente = true;
						}	
						// Con soap:Client, non ci deveno essere Detail, e ci deve essere FAULT_STRING_VALIDAZIONE_SPCOOP!
						if ( !(SPCoopCostanti.FAULT_STRING_VALIDAZIONE.equals(faultS)) ) {
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_ECCEZIONI_NON_VALIDA_POSIZIONE_SOAP_FAULT_STRING.toString());
							this.errorsTrovatiSullaListaEccezioni.add(ecc);
						}
						if (detailPresente) {
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_ECCEZIONI_NON_VALIDA_POSIZIONE_SOAP_FAULT_DETAILS_PRESENTI.toString());
							this.errorsTrovatiSullaListaEccezioni.add(ecc);
						}
					}
					if ("Server".equals(codeS.getLocalName()) ){
						// Con soap:Server, ci deve essere FAULT_STRING_PROCESSAMENTO_SPCOOP!
						if ( !(SPCoopCostanti.FAULT_STRING_PROCESSAMENTO.equals(faultS)) ) {
							Eccezione ecc = new Eccezione();
							ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
							ecc.setCodiceEccezione(CodiceErroreCooperazione.FORMATO_CORPO_NON_CORRETTO);
							ecc.setRilevanza(LivelloRilevanza.ERROR);
							ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_ECCEZIONI_NON_VALIDA_POSIZIONE_SOAP_FAULT_STRING.toString());
							this.errorsTrovatiSullaListaEccezioni.add(ecc);
						}
					}
				}
			}
		}catch(Exception e){
			this.log.error("Errore durante la validazione del SoapFault",e);
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.PROCESSAMENTO);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO);
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione("Validazione SoapFault: errore di processamento");
			this.erroriProcessamento.add(ecc);
			return;
		}
	}



	public void validazioneManifestAttachmentsEGov(OpenSPCoop2Message msgParam,ProprietaManifestAttachments proprietaManifestAttachments){
		//log.info("VALIDAZIONE MANIFEST");
		SOAPBody soapBody = null;
		try{
			OpenSPCoop2SoapMessage msg = msgParam.castAsSoap();
			OpenSPCoop2MessageFactory messageFactory = msg.getFactory();
			
			java.util.List<String> contentID = new java.util.ArrayList<>();
			java.util.List<String> contentLocation = new java.util.ArrayList<>();
			java.util.Iterator<?> it = msg.getAttachments();
			
			while(it.hasNext()){
				AttachmentPart ap = (AttachmentPart) it.next();
				contentID.add(ap.getContentId());
				contentLocation.add(ap.getContentLocation());
				//log.info("Attachments con ID["+ap.getContentId()+"] e Location["+ap.getContentLocation()+"]");
			}



			boolean isRichiesta = false;
			boolean isRisposta = false;

			soapBody = msg.getSOAPBody();
			List<Node> soapBodyList = SoapUtils.getNotEmptyChildNodes(messageFactory, soapBody);
			if(soapBodyList.size()!=1){
				// Il body deve possedere esattamente un elemento
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				ecc.setCodiceEccezione(CodiceErroreCooperazione.ALLEGATI);
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MANIFEST_POSIZIONE+" child size:"+soapBodyList.size());
				this.erroriValidazione.add(ecc);
				return;
			}

			//log.info("Validazione Descrizione...");
			Node descrizione = soapBodyList.get(0);
			String prefixManifest = descrizione.getPrefix();
			if(prefixManifest== null)
				prefixManifest = "";
			if("".equals(prefixManifest)==false)
				prefixManifest = prefixManifest + ":";
			//log.info("esamino["+descrizione.getNodeName()+"]");
			//if(!(descrizione.getNodeName().equals(prefixManifest+"Descrizione"))){
			if(!(SoapUtils.matchLocalName(messageFactory, descrizione, "Descrizione", prefixManifest, SPCoopCostanti.NAMESPACE_EGOV))){		
				// Elemento Descrizione non esistente
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				ecc.setCodiceEccezione(CodiceErroreCooperazione.ALLEGATI);
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MANIFEST_POSIZIONE_DESCRIZIONE.toString());
				this.erroriValidazione.add(ecc);
				return;
			}
			if(SPCoopCostanti.NAMESPACE_EGOV.equals(descrizione.getNamespaceURI())==false){
				// Elemento Descrizione non esistente
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				ecc.setCodiceEccezione(CodiceErroreCooperazione.ALLEGATI);
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MANIFEST_POSIZIONE_DESCRIZIONE_NAMESPACE.toString());
				this.erroriValidazione.add(ecc);
				return;
			}




			List<Node> descrizioneMessaggi = SoapUtils.getNotEmptyChildNodes(messageFactory, descrizione);
			if(descrizioneMessaggi.size()<=0){
				//	Elemento DescrizioneMessaggio non esistente
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				ecc.setCodiceEccezione(CodiceErroreCooperazione.ALLEGATI);
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MANIFEST_POSIZIONE_DESCRIZIONE+" child size:"+descrizioneMessaggi.size());
				this.erroriValidazione.add(ecc);
				return;
			}
			for(int i=0; i<descrizioneMessaggi.size();i++){

				//log.info("Validazione DescrizioneMessaggio...");
				Node descrizioneMessaggio = descrizioneMessaggi.get(i);
				//log.info("esamino["+descrizioneMessaggio.getNodeName()+"]");
				//if(!(descrizioneMessaggio.getNodeName().equals(prefixManifest+SPCoopCostanti.LOCAL_NAME_MANIFEST_EGOV_DESCRIZIONE_MESSAGGIO))){
				if(!(SoapUtils.matchLocalName(messageFactory, descrizioneMessaggio, SPCoopCostanti.LOCAL_NAME_MANIFEST_EGOV_DESCRIZIONE_MESSAGGIO, prefixManifest, SPCoopCostanti.NAMESPACE_EGOV))){
					//	Elemento DescrizioneMessaggio non esistente
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.ALLEGATI);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MANIFEST_POSIZIONE_DESCRIZIONE+"/child["+descrizioneMessaggio.getNodeName()+"]");
					this.erroriValidazione.add(ecc);
					continue;
				}

				//log.info("Validazione Riferimento...");
				List<Node> riferimentoList = SoapUtils.getNotEmptyChildNodes(messageFactory, descrizioneMessaggio);
				if(riferimentoList.size()!=1){
					//	Elemento Riferimento non esistente
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.ALLEGATI);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MANIFEST_POSIZIONE_DESCRIZIONE_DESCRIZIONE_MESSAGGIO +" child size:"+riferimentoList.size());
					this.erroriValidazione.add(ecc);
					continue;
				}
				Node riferimento = riferimentoList.get(0);
				//log.info("esamino["+riferimento.getNodeName()+"]");
				//if(!(riferimento.getNodeName().equals(prefixManifest+"Riferimento"))){
				if(!(SoapUtils.matchLocalName(messageFactory, riferimento, "Riferimento", prefixManifest, SPCoopCostanti.NAMESPACE_EGOV))){
					//	Elemento Riferimento non esistente
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.ALLEGATI_RIFERIMENTO_NON_PRESENTE);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MANIFEST_POSIZIONE_DESCRIZIONE_DESCRIZIONE_MESSAGGIO+"/child["+riferimento.getNodeName()+"]");
					this.erroriValidazione.add(ecc);
					continue;
				}

				// href
				String href = null;
				boolean hrefError = false;
				try{
					Node hrefFind = null;
					if(this.readQualifiedAttribute){
						hrefFind = SoapUtils.getQualifiedAttributeNode(messageFactory, riferimento, "href", SPCoopCostanti.NAMESPACE_EGOV);
					}else{
						hrefFind = SoapUtils.getAttributeNode(messageFactory, riferimento, "href");
					}
					href = hrefFind.getNodeValue();
				} catch(Exception e) {
					hrefError = true;
				}
				if(href == null)
					hrefError = true;
				if(hrefError){
					//	Elemento Riferimento non esistente
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.ALLEGATI_RIFERIMENTO_NON_VALIDO);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MANIFEST_POSIZIONE_DESCRIZIONE_DESCRIZIONE_MESSAGGIO_RIFERIMENTO_HREF.toString());
					this.erroriValidazione.add(ecc);
					continue;
				}
				// VALIDAZIONE HREF
				
				
				
				boolean findHRef = false;
				for(int k=0; k<contentID.size(); k++){
					if(href.equals(contentID.get(k)) || 
							href.equals("cid:"+contentID.get(k)) ||
							href.equals(contentLocation.get(k)) ){
						contentID.remove(k);
						contentLocation.remove(k);
						findHRef = true;
						break;
					}
					else{
						// verifico se per caso l'href fornito non contiene i '<' e '>'.
						// per retrocompatibilità provo ad aggiungergli io
						String hrefNew = new String(href);
						String cidPref = "";
						if(hrefNew.startsWith("cid:")){
							hrefNew = hrefNew.substring("cid:".length());
							cidPref = "cid:";
						}
						if(hrefNew.startsWith("<")==false){
							hrefNew = "<"+hrefNew;
						}
						if(hrefNew.endsWith(">")==false){
							hrefNew = hrefNew + ">";
						}
						hrefNew = cidPref + hrefNew;
						if(hrefNew.equals(href)==false){
							if(hrefNew.equals(contentID.get(k)) || 
									hrefNew.equals("cid:"+contentID.get(k)) ){
								contentID.remove(k);
								contentLocation.remove(k);
								findHRef = true;
								break;
							}
						}
					}
				}
				if(findHRef == false){
					//	RiferimentoAttachment non esistente
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.ALLEGATO_NON_PRESENTE);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MANIFEST_POSIZIONE_DESCRIZIONE_DESCRIZIONE_MESSAGGIO_RIFERIMENTO_HREF+"["+href+"]");
					this.erroriValidazione.add(ecc);
				}


				// role
				String role = null;
				boolean roleError = false;
				try{
					Node roleFind = null;
					if(this.readQualifiedAttribute){
						roleFind = SoapUtils.getQualifiedAttributeNode(messageFactory, riferimento, "role", SPCoopCostanti.NAMESPACE_EGOV);
					}else{
						roleFind = SoapUtils.getAttributeNode(messageFactory, riferimento, "role");
					}
					role = roleFind.getNodeValue();
				} catch(Exception e) {
					roleError = true;
				}
				if(role == null)
					roleError = true;
				if(roleError){
					//	Elemento Riferimento non esistente
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.ALLEGATI);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MANIFEST_POSIZIONE_DESCRIZIONE_DESCRIZIONE_MESSAGGIO_RIFERIMENTO_ROLE.toString());
					this.erroriValidazione.add(ecc);
					continue;
				}

				// CHECK Semantica Ruolo
				if(this.spcoopProperties.getRoleRichiestaManifest().equalsIgnoreCase(role) ||
						this.spcoopProperties.getRoleRispostaManifest().equalsIgnoreCase(role)	){
					if(isRichiesta || isRisposta){
						//	Doppio elemento 'Richiesta/Risposta'
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						// uso il riferiemnto non valido per farlo tradurre con codice 118 e quindi farlo gestire bene ad InoltroBuste, per non far gestire il manifest in fase di sbustamento
						ecc.setCodiceEccezione(CodiceErroreCooperazione.ALLEGATI_RIFERIMENTO_NON_VALIDO);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						// (Manifest degli attachments) Esistono più di una descrizione di messaggio
						// con 'role' discriminante ('"+Costanti.ATTACHMENTS_MANIFEST_RICHIESTA+"'/'"+Costanti.ATTACHMENTS_MANIFEST_RISPOSTA+"').
						String posizioneErrore = SPCoopCostantiPosizioneEccezione.ECCEZIONE_MANIFEST_POSIZIONE_DESCRIZIONE_DESCRIZIONE_MESSAGGIO_RIFERIMENTO_ROLE_PRINCIPALE_DUPLICATO.toString();
						posizioneErrore = posizioneErrore.replace(SPCoopCostanti.MANIFEST_KEY_ROLE_RICHIESTA, this.spcoopProperties.getRoleRichiestaManifest());
						posizioneErrore = posizioneErrore.replace(SPCoopCostanti.MANIFEST_KEY_ROLE_RISPOSTA, this.spcoopProperties.getRoleRispostaManifest());
						ecc.setDescrizione(posizioneErrore);
						this.erroriValidazione.add(ecc);
						continue;
					}
					if(this.spcoopProperties.getRoleRichiestaManifest().equalsIgnoreCase(role))
						isRichiesta = true;
					else
						isRisposta = true;
				}


				// id
				String id = null;
				boolean idError = false;
				try{
					// Deve essere sempre preso come qualificato.
					Node idFind = SoapUtils.getQualifiedAttributeNode(messageFactory, riferimento, "id", SPCoopCostanti.NAMESPACE_EGOV);
					id = idFind.getNodeValue();
				} catch(Exception e) {
					idError = true;
				}
				if(id == null)
					idError = true;
				if(idError){
					//	Elemento Riferimento non esistente
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.ALLEGATI);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MANIFEST_POSIZIONE_DESCRIZIONE_DESCRIZIONE_MESSAGGIO_RIFERIMENTO_ID.toString());
					this.erroriValidazione.add(ecc);
					continue;
				}


				// check elementi Schema e Titolo
				List<Node> elementiRiferimento = SoapUtils.getNotEmptyChildNodes(messageFactory, riferimento);
				if(elementiRiferimento.size()!=2){
					//	Elemento Schema non esistente
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.ALLEGATI);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MANIFEST_POSIZIONE_DESCRIZIONE_DESCRIZIONE_MESSAGGIO_RIFERIMENTO+" child size:"+elementiRiferimento.size());
					this.erroriValidazione.add(ecc);
					continue;
				}

				Node child = elementiRiferimento.get(0);
				Node schema = null;
				Node titolo = null;
				//if(child.getNodeName().equals(prefixManifest+"Schema")){
				if(SoapUtils.matchLocalName(messageFactory, child, "Schema", prefixManifest, SPCoopCostanti.NAMESPACE_EGOV)){
					schema = child;
					titolo = elementiRiferimento.get(1);				
				//}else if(child.getNodeName().equals(prefixManifest+"Titolo")){
				}else if(SoapUtils.matchLocalName(messageFactory, child, "Titolo", prefixManifest, SPCoopCostanti.NAMESPACE_EGOV)){	
					titolo = child;
					schema = elementiRiferimento.get(1);
				}else{
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.ALLEGATI);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MANIFEST_POSIZIONE_DESCRIZIONE_DESCRIZIONE_MESSAGGIO_RIFERIMENTO+"/child["+child.getNodeName()+"]");
					this.erroriValidazione.add(ecc);
					continue;
				}


				//log.info("Validazione Schema...");			
				//log.info("esamino["+schema.getNodeName()+"]");
				//if(!(schema.getNodeName().equals(prefixManifest+"Schema"))){
				if(!(SoapUtils.matchLocalName(messageFactory, schema, "Schema", prefixManifest, SPCoopCostanti.NAMESPACE_EGOV))){
					//	Elemento Riferimento non esistente
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.ALLEGATI);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MANIFEST_POSIZIONE_DESCRIZIONE_DESCRIZIONE_MESSAGGIO_RIFERIMENTO_SCHEMA.toString());
					this.erroriValidazione.add(ecc);
					continue;
				}

				// posizione
				String posizione = null;
				boolean posizioneError = false;
				try{
					Node posizioneFind = null;
					if(this.readQualifiedAttribute){
						posizioneFind = SoapUtils.getQualifiedAttributeNode(messageFactory, schema, "posizione", SPCoopCostanti.NAMESPACE_EGOV);
					}else{
						posizioneFind = SoapUtils.getAttributeNode(messageFactory, schema, "posizione");
					}
					posizione = posizioneFind.getNodeValue();
				} catch(Exception e) {
					posizioneError = true;
				}
				if(posizione == null)
					posizioneError = true;
				if(posizioneError){
					//	Elemento Riferimento non esistente
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.ALLEGATI);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MANIFEST_POSIZIONE_DESCRIZIONE_DESCRIZIONE_MESSAGGIO_RIFERIMENTO_SCHEMA_POSIZIONE.toString());
					this.erroriValidazione.add(ecc);
					continue;
				}



				//log.info("Validazione Titolo...");
				//log.info("esamino["+titolo.getNodeName()+"]");
				//if(!(titolo.getNodeName().equals(prefixManifest+"Titolo"))){
				if(!(SoapUtils.matchLocalName(messageFactory, titolo, "Titolo", prefixManifest, SPCoopCostanti.NAMESPACE_EGOV))){
					//	Elemento Riferimento non esistente
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.ALLEGATI);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MANIFEST_POSIZIONE_DESCRIZIONE_DESCRIZIONE_MESSAGGIO_RIFERIMENTO_TITOLO.toString());
					this.erroriValidazione.add(ecc);
					continue;
				}

				// Lingua
				String Lingua = null;
				try{
					Node LinguaFind = null;
					if(this.readQualifiedAttribute){
						LinguaFind = SoapUtils.getQualifiedAttributeNode(messageFactory, titolo, "Lingua", SPCoopCostanti.NAMESPACE_EGOV);
					}else{
						LinguaFind = SoapUtils.getAttributeNode(messageFactory, titolo, "Lingua");
					}
					Lingua = LinguaFind.getNodeValue();
				} catch(Exception e) {
					// ignore
				}
				if(Lingua == null)
					Lingua = "it"; // default is it

				String valoreTitolo = null;
				try{
					valoreTitolo = SoapUtils.getNotEmptyChildNodes(messageFactory, titolo).get(0).getNodeValue();
					if(valoreTitolo == null)
						throw new Exception("valore non presente");
				} catch(Exception e) {
					//	Elemento Titolo con scorretto valore
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.ALLEGATI);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MANIFEST_POSIZIONE_DESCRIZIONE_DESCRIZIONE_MESSAGGIO_RIFERIMENTO_TITOLO.toString());
					this.erroriValidazione.add(ecc);
					continue;
				}
			}

			// Validazione role Richiesta/Risposta
			if( isRichiesta==false && isRisposta ==false){
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				// uso il riferiemnto non valido per farlo tradurre con codice 118 e quindi farlo gestire bene ad InoltroBuste, per non far gestire il manifest in fase di sbustamento
				ecc.setCodiceEccezione(CodiceErroreCooperazione.ALLEGATI_RIFERIMENTO_NON_VALIDO);
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				String posizioneErrore = SPCoopCostantiPosizioneEccezione.ECCEZIONE_MANIFEST_POSIZIONE_DESCRIZIONE_DESCRIZIONE_MESSAGGIO_RIFERIMENTO_ROLE_PRINCIPALE_ASSENTE.toString();
				posizioneErrore = posizioneErrore.replace(SPCoopCostanti.MANIFEST_KEY_ROLE_RICHIESTA, this.spcoopProperties.getRoleRichiestaManifest());
				posizioneErrore = posizioneErrore.replace(SPCoopCostanti.MANIFEST_KEY_ROLE_RISPOSTA, this.spcoopProperties.getRoleRispostaManifest());
				ecc.setDescrizione(posizioneErrore);
				this.erroriValidazione.add(ecc);
				return;
			}


			// Validazione href
			while(contentID.size()>0){
				//	RiferimentoAttachment non definito in manifest
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				ecc.setCodiceEccezione(CodiceErroreCooperazione.ALLEGATO_NON_DEFINITO_MANIFEST);
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				String href = contentID.remove(0);
				if(href==null)
					href = contentLocation.remove(0);
				else
					contentLocation.remove(0);
				// (Manifest degli attachments) Allegato con id/location ["+href+"] non riferito attraverso opportuno elemento nel Manifest degli attachments.
				ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_MANIFEST_POSIZIONE_DESCRIZIONE_DESCRIZIONE_MESSAGGIO_RIFERIMENTO_HREF+"["+href+"] non presente");
				this.erroriValidazione.add(ecc);
			}
			return;

		}catch(Exception e){
			this.log.error("Errore durante la validazione del Manifest degli attachments",e);
			Eccezione ecc = new Eccezione();
			ecc.setContestoCodifica(ContestoCodificaEccezione.PROCESSAMENTO);
			ecc.setCodiceEccezione(CodiceErroreCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO);
			ecc.setRilevanza(LivelloRilevanza.ERROR);
			ecc.setDescrizione("Manifest degli attachments: errore di processamento");
			this.erroriProcessamento.add(ecc);
			return;
		}
		finally{
			// *** GB ***
			soapBody = null;
			// *** GB ***
		}

	}




	/**
	 * Metodo che si occupa di validare la data <var>aDate</var>
	 * secondo la specifica eGov.
	 * La Data deve essere formato da :
	 * yyyy-MM-ddThh:mm:ss[.SSS]    (es. il 23/03/2005 alle 13:56:01 viene registrato come 2005-03-23T13:56:01)
	 * In caso la validazione abbia successo, viene ritornato un oggetto Date inizializzato alla data <var>aDate</var>.
	 *
	 * @param aDate data eGov da validare
	 * @return un oggetto Date inizializzato  alla <var>aDate</var>, se essa e' conforme alla specifica eGov, null altrimenti.
	 * 
	 */
	private Date validazioneData(String aDate){

		try{

			String [] split = aDate.split("T");
			if(split == null)
				return null;
			if(split.length != 2)
				return null;

			// Check data yyyy-MM-dd
			String [] date = split[0].split("-");
			if(date == null)
				return null;
			if(date.length != 3)
				return null;
			if(date[0].length() != 4)
				return null;
			try{
				Integer test = Integer.valueOf(date[0]);
				if(test.intValue()>2100)
					return null;
			} catch(Exception e){
				return null;
			} 
			if(date[1].length() != 2)
				return null;
			if(date[2].length() != 2)
				return null;
			try{
				Integer mese = Integer.valueOf(date[1]);
				if(mese.intValue()>12 || mese.intValue() < 0)
					return null;
				Integer giorno = Integer.valueOf(date[2]);
				if(giorno.intValue() < 0)
					return null;
				if(giorno.intValue()>29 && mese.intValue() == 2)
					return null;
				else if(giorno.intValue()>30 && 
						(  (mese.intValue() == 4) ||
								(mese.intValue() == 6) ||
								(mese.intValue() == 9) ||
								(mese.intValue() == 11) ) )
					return null;
				else if(giorno.intValue()>31)
					return null;
			} catch(Exception e){
				return null;
			} 

			// Check ora hh:mm:ss
			String [] ora = split[1].split(":");
			if(ora == null)
				return null;
			if(ora.length < 3)
				return null;

			// Check ora
			if(ora[0].length() != 2)
				return null;
			try{
				Integer test = Integer.valueOf(ora[0]);
				if(test.intValue() > 23 || test.intValue() < 0)
					return null;
			} catch(Exception e){
				return null;
			} 

			if(ora[1].length() != 2)
				return null;
			try{
				Integer test = Integer.valueOf(ora[1]);
				if(test.intValue() > 59 || test.intValue() < 0)
					return null;
			} catch(Exception e){
				return null;
			} 


			// Secondi...
			String secondi = null;
			if(ora[2].length() < 2)
				return null;
			try{
				secondi = "" + ora[2].charAt(0) + ora[2].charAt(1);
				Integer test = Integer.valueOf(secondi);
				if(test.intValue() > 59 || test.intValue() < 0)
					return null;
			} catch(Exception e){
				return null;
			} 

			GregorianCalendar calendar = null;
			try{
				calendar = 
					new GregorianCalendar( (Integer.valueOf(date[0])).intValue(),
							((Integer.valueOf(date[1])).intValue()-1), // il mese is 0-Based
							(Integer.valueOf(date[2])).intValue(),
							(Integer.valueOf(ora[0])).intValue(),
							(Integer.valueOf(ora[1])).intValue(),
							(Integer.valueOf(secondi)).intValue());
			} catch(Exception e){
				return null;
			} 

			long value = (calendar.getTime()).getTime(); //+ (1000 * 60 *60);
			return new Date(value);

		}catch(Exception error){
			return null;
		}
	}



	/**
	 * Metodo che si occupa di verificare che la data <var>scadenza</var> descritta con un formato
	 * conforme alla specifica eGov, non sia scaduta.
	 * La Data deve essere formato da :
	 * yyyy-MM-ddThh:mm:ss    (es. il 23/03/2005 alle 13:56:01 viene registrato come 2005-03-23T13:56:01)
	 *
	 * @param scadenza data eGov da controllare se e' scaduta o meno.
	 * @return un boolean true se la data non e' scaduta. Altrimenti false.
	 * 
	 */
	private boolean dataScaduta(String scadenza){
		Date now=DateManager.getDate();
		SimpleDateFormat dateformat = DateUtils.getDefaultDateTimeFormatter("yyyy MM dd HH mm ss");
		String nowFormat = dateformat.format(now);
		String scadenzaFormat = ((scadenza.replace('-',' ')).replace(':',' ')).replace('T',' ');
		String [] splitNow = nowFormat.split(" ");
		String [] splitScadenza = scadenzaFormat.split(" ");


		if (validazioneData(scadenza)  == null)
			return false;

		try{
			Integer testNowAnno = Integer.valueOf(splitNow[0]);
			Integer testScadenzaAnno = Integer.valueOf(splitScadenza[0]);
			Integer testNowMese = Integer.valueOf(splitNow[1]);
			Integer testScadenzaMese = Integer.valueOf(splitScadenza[1]);
			Integer testNowGiorno = Integer.valueOf(splitNow[2]);
			Integer testScadenzaGiorno = Integer.valueOf(splitScadenza[2]);
			Integer testNowOra = Integer.valueOf(splitNow[3]);
			Integer testScadenzaOra = Integer.valueOf(splitScadenza[3]);
			Integer testNowMinuti = Integer.valueOf(splitNow[4]);
			Integer testScadenzaMinuti = Integer.valueOf(splitScadenza[4]);
			Integer testNowSecondi = Integer.valueOf(splitNow[5]);
			Integer testScadenzaSecondi = Integer.valueOf(splitScadenza[5].charAt(0) + splitScadenza[5].charAt(1));
			if(testNowAnno.intValue() > testScadenzaAnno.intValue())
				return true;
			else if ( (testNowAnno.intValue() == testScadenzaAnno.intValue()) &&
					(testNowMese.intValue() > testScadenzaMese.intValue()) )
				return true;
			else if ( (testNowAnno.intValue() == testScadenzaAnno.intValue()) &&
					(testNowMese.intValue() == testScadenzaMese.intValue()) &&
					(testNowGiorno.intValue() > testScadenzaGiorno.intValue()) )
				return true;
			else if ( (testNowAnno.intValue() == testScadenzaAnno.intValue()) &&
					(testNowMese.intValue() == testScadenzaMese.intValue()) &&
					(testNowGiorno.intValue() == testScadenzaGiorno.intValue()) &&
					(testNowOra.intValue() > testScadenzaOra.intValue()) )
				return true;
			else if ( (testNowAnno.intValue() == testScadenzaAnno.intValue()) &&
					(testNowMese.intValue() == testScadenzaMese.intValue()) &&
					(testNowGiorno.intValue() == testScadenzaGiorno.intValue()) &&
					(testNowOra.intValue() == testScadenzaOra.intValue()) &&
					(testNowMinuti.intValue() > testScadenzaMinuti.intValue()) )
				return true;
			else if ( (testNowAnno.intValue() == testScadenzaAnno.intValue()) &&
					(testNowMese.intValue() == testScadenzaMese.intValue()) &&
					(testNowGiorno.intValue() == testScadenzaGiorno.intValue()) &&
					(testNowOra.intValue() == testScadenzaOra.intValue()) &&
					(testNowMinuti.intValue() == testScadenzaMinuti.intValue()) &&
					(testNowSecondi.intValue() > testScadenzaSecondi.intValue()) )
				return true;

		} catch(Exception e){
			return true;
		} 

		return false;
	}
	
		
	private void validazioneDatePresentiRispettoDateFuture() throws ProtocolException{
		
		int intervalloTolleranza = this.spcoopProperties.getIntervalloMinutiTolleranzaDateFuture();
		
		Date sistema = DateManager.getDate();
		Date dataFuturaMassimaAccettata = new Date(sistema.getTime()+(intervalloTolleranza*60*1000));
		
		
		// Ora Registrazione, altrimenti segnalero' il problema
		if(this.busta.getOraRegistrazione()!=null){
			if( this.busta.getOraRegistrazione().after(dataFuturaMassimaAccettata)){
				this.log.error("Data portata nell'ora di registrazione ["+SPCoopUtils.getDate_eGovFormat(this.busta.getOraRegistrazione())+"] futura rispetto all'ora attuale di sistema ("+
						SPCoopUtils.getDate_eGovFormat(sistema)+") e l'intervallo di tolleranza impostato a "+intervalloTolleranza+" minuti");
				Eccezione ecc = new Eccezione();
				ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
				ecc.setCodiceEccezione(CodiceErroreCooperazione.ORA_REGISTRAZIONE_NON_VALIDA);
				ecc.setRilevanza(LivelloRilevanza.ERROR);
				ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_ORA_REGISTRAZIONE_NON_VALIDA_POSIZIONE.toString());
				this.erroriValidazione.add(ecc);
			}
		}
		
		// Check su id egov
		// Se correttamente formato, altrimenti segnalero' il problema
		if(this.busta.getID()!=null){
			String [] split = this.busta.getID().split("_");
			if(split != null && split.length == 5){
				Date dataIntoIDEgov = null;
				try{
					SimpleDateFormat dateformat = DateUtils.getSimpleDateFormatMinute();
					dataIntoIDEgov = dateformat.parse(split[3]+"_"+split[4]);
				}catch(Exception e){
					// ignore
				}
				if(dataIntoIDEgov!=null){
					//System.out.println("DATA IDEGOV BUSTA ["+dataIntoIDEgov.toString()
					//		+"]   MINIMA ["+oraRegistrazioneMinimaAccettata.toString()+"]");
					if( dataIntoIDEgov.after(dataFuturaMassimaAccettata)){
						this.log.error("Data portata nell'identificativo egov ["+this.busta.getID()+"]["+SPCoopUtils.getDate_eGovFormat(dataIntoIDEgov)+"] futura rispetto all'ora attuale di sistema ("+
								SPCoopUtils.getDate_eGovFormat(sistema)+") e l'intervallo di tolleranza impostato a "+intervalloTolleranza+" minuti");
						Eccezione ecc = new Eccezione();
						ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
						ecc.setCodiceEccezione(CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_NON_VALIDO);
						ecc.setRilevanza(LivelloRilevanza.ERROR);
						ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_ID_MESSAGGIO_NON_VALIDO_POSIZIONE.toString());
						this.erroriValidazione.add(ecc);
					}
				}
			}
		}
		
		// Ora Registrazione nei riscontri, altrimenti segnalero' il problema
		for(int i=0; i<this.busta.sizeListaRiscontri(); i++){
			Riscontro riscontro = this.busta.getRiscontro(i);
			if(riscontro.getOraRegistrazione()!=null){
				if( riscontro.getOraRegistrazione().after(dataFuturaMassimaAccettata)){
					this.log.error("Data portata nell'ora di registrazione del riscontro con id ["+riscontro.getID()+"] ["+SPCoopUtils.getDate_eGovFormat(riscontro.getOraRegistrazione())
							+"] futura rispetto all'ora attuale di sistema ("+
							SPCoopUtils.getDate_eGovFormat(sistema)+") e l'intervallo di tolleranza impostato a "+intervalloTolleranza+" minuti");
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.RISCONTRO_ORA_REGISTRAZIONE_NON_VALIDA);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_RISCONTRI_NON_VALIDA_POSIZIONE_RISCONTRO_ORA_REGISTRAZIONE.toString());
					this.erroriValidazione.add(ecc);
				}
			}
		}
		
		// Ora Registrazione nelle trasmissioni, altrimenti segnalero' il problema
		for(int i=0; i<this.busta.sizeListaTrasmissioni(); i++){
			Trasmissione trasmissione = this.busta.getTrasmissione(i);
			if(trasmissione.getOraRegistrazione()!=null){
				if( trasmissione.getOraRegistrazione().after(dataFuturaMassimaAccettata)){
					this.log.error("Data portata nell'ora di registrazione di una trasmissione ["+SPCoopUtils.getDate_eGovFormat(trasmissione.getOraRegistrazione())
							+"] futura rispetto all'ora attuale di sistema ("+
							SPCoopUtils.getDate_eGovFormat(sistema)+") e l'intervallo di tolleranza impostato a "+intervalloTolleranza+" minuti");
					Eccezione ecc = new Eccezione();
					ecc.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
					ecc.setCodiceEccezione(CodiceErroreCooperazione.TRASMISSIONE_ORA_REGISTRAZIONE_NON_VALIDA);
					ecc.setRilevanza(LivelloRilevanza.ERROR);
					ecc.setDescrizione(SPCoopCostantiPosizioneEccezione.ECCEZIONE_LISTA_TRASMISSIONI_NON_VALIDA_POSIZIONE_TRASMISSIONE_ORA_REGISTRAZIONE.toString());
					this.erroriValidazione.add(ecc);
				}
			}
		}
	}


	@Override
	public ValidazioneSintatticaResult<SOAPHeaderElement> validaRichiesta(OpenSPCoop2Message msg,  Busta datiBustaLettiURLMappingProperties, ProprietaValidazioneErrori proprietaValidazioneErrori) throws ProtocolException{
		try{
			this.msg = msg.castAsSoap();
		}catch(Exception e){
			throw new ProtocolException(e.getMessage(),e);
		}
		boolean isValido = this.valida(false);
		ErroreCooperazione errore = null;
		if(this.msgErrore!=null && this.codiceErrore!=null){
			errore = new ErroreCooperazione(this.msgErrore, this.codiceErrore);
		}
		ValidazioneSintatticaResult<SOAPHeaderElement> result = new ValidazioneSintatticaResult<SOAPHeaderElement>(this.erroriValidazione, this.erroriProcessamento, 
				this.errorsTrovatiSullaListaEccezioni, this.busta, errore, this.bustaErroreHeaderIntestazione, this.headerEGov, isValido);
		return result;
	}
	
	@Override
	public ValidazioneSintatticaResult<SOAPHeaderElement> validaRisposta(OpenSPCoop2Message msg, Busta bustaRichiesta, ProprietaValidazioneErrori proprietaValidazioneErrori) throws ProtocolException{
		try{
			this.msg = msg.castAsSoap();
		}catch(Exception e){
			throw new ProtocolException(e.getMessage(),e);
		}
		boolean isValido = this.valida(false);
		ErroreCooperazione errore = null;
		if(this.msgErrore!=null && this.codiceErrore!=null){
			errore = new ErroreCooperazione(this.msgErrore, this.codiceErrore);
		}
		ValidazioneSintatticaResult<SOAPHeaderElement> result = new ValidazioneSintatticaResult<SOAPHeaderElement>(this.erroriValidazione, this.erroriProcessamento, 
				this.errorsTrovatiSullaListaEccezioni, this.busta, errore, this.bustaErroreHeaderIntestazione, this.headerEGov, isValido);
		return result;
	}
	
	@Override
	public boolean verifyProtocolPresence(TipoPdD tipoPdD, ProfiloDiCollaborazione profilo, RuoloMessaggio ruoloMessaggio,
			OpenSPCoop2Message msg) throws ProtocolException{
		if(msg==null){
			return false;
		}
		OpenSPCoop2SoapMessage soap = null;
		try{
			soap = msg.castAsSoap();
		}catch(Exception e){
			throw new ProtocolException(e.getMessage(),e);
		}
		return this.existsHeaderEGov(soap);
	}

	@Override
	public ValidazioneSintatticaResult<SOAPHeaderElement> validazioneManifestAttachments(
			OpenSPCoop2Message msg,
			ProprietaManifestAttachments proprietaManifestAttachments) {
		this.validazioneManifestAttachmentsEGov(msg, proprietaManifestAttachments);
		ErroreCooperazione errore = null;
		if(this.msgErrore!=null && this.codiceErrore!=null){
			errore = new ErroreCooperazione(this.msgErrore, this.codiceErrore);
		}
		ValidazioneSintatticaResult<SOAPHeaderElement> result = new ValidazioneSintatticaResult<SOAPHeaderElement>(this.erroriValidazione, this.erroriProcessamento, 
				this.errorsTrovatiSullaListaEccezioni, this.busta, errore, this.bustaErroreHeaderIntestazione, this.headerEGov, true);
		return result;
	}

	@Override
	public SPCoopBustaRawContent getBustaRawContent_senzaControlli(
			OpenSPCoop2Message msg) throws ProtocolException {
		try{
			this.msg = msg.castAsSoap();
		}catch(Exception e){
			throw new ProtocolException(e.getMessage(),e);
		}
		return this.getHeaderEGov_senzaControlli();
	}
	
	@Override
	public Busta getBusta_senzaControlli(OpenSPCoop2Message msg) throws ProtocolException{
		try{
			this.msg = msg.castAsSoap();
		}catch(Exception e){
			throw new ProtocolException(e.getMessage(),e);
		}
		if(this.valida(true)){
			return this.busta;
		}
		else{
			return this.bustaErroreHeaderIntestazione;
		}
	}

	@Override
	public ValidazioneSintatticaResult<SOAPHeaderElement> validazioneFault(OpenSPCoop2Message msg) {
		this.validazioneFaultEGov(msg);
		ErroreCooperazione errore = null;
		if(this.msgErrore!=null && this.codiceErrore!=null){
			errore = new ErroreCooperazione(this.msgErrore, this.codiceErrore);
		}
		ValidazioneSintatticaResult<SOAPHeaderElement> result = new ValidazioneSintatticaResult<SOAPHeaderElement>(this.erroriValidazione, this.erroriProcessamento, 
				this.errorsTrovatiSullaListaEccezioni, this.busta, errore, this.bustaErroreHeaderIntestazione, this.headerEGov, true);
		return result;
	}

	
	public ProfiloDiCollaborazione toProfilo(String profilo){
		if(SPCoopCostanti.PROFILO_COLLABORAZIONE_ONEWAY.equals(profilo))
			return ProfiloDiCollaborazione.ONEWAY;
		if(SPCoopCostanti.PROFILO_COLLABORAZIONE_SINCRONO.equals(profilo))
			return ProfiloDiCollaborazione.SINCRONO;
		if(SPCoopCostanti.PROFILO_COLLABORAZIONE_ASINCRONO_ASIMMETRICO.equals(profilo))
			return ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO;
		if(SPCoopCostanti.PROFILO_COLLABORAZIONE_ASINCRONO_SIMMETRICO.equals(profilo))
			return ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO;
		return ProfiloDiCollaborazione.UNKNOWN;
	}
	public TipoOraRegistrazione toTipoOra(String tipoora){
		if(SPCoopCostanti.TIPO_TEMPO_LOCALE.equals(tipoora))
			return TipoOraRegistrazione.LOCALE;
		if(SPCoopCostanti.TIPO_TEMPO_SPC.equals(tipoora))
			return TipoOraRegistrazione.SINCRONIZZATO;
		return TipoOraRegistrazione.UNKNOWN;
	}
	public Inoltro toInoltro(String inoltro){
		if(SPCoopCostanti.PROFILO_TRASMISSIONE_CON_DUPLICATI.equals(inoltro))
			return Inoltro.CON_DUPLICATI;
		if(SPCoopCostanti.PROFILO_TRASMISSIONE_SENZA_DUPLICATI.equals(inoltro))
			return Inoltro.SENZA_DUPLICATI;
		return Inoltro.UNKNOWN;
	}
}