Busta.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.sdk;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.tracciamento.Data;
import org.openspcoop2.core.tracciamento.Eccezioni;
import org.openspcoop2.core.tracciamento.ProfiloCollaborazione;
import org.openspcoop2.core.tracciamento.ProfiloTrasmissione;
import org.openspcoop2.core.tracciamento.Proprieta;
import org.openspcoop2.core.tracciamento.Protocollo;
import org.openspcoop2.core.tracciamento.Riscontri;
import org.openspcoop2.core.tracciamento.Soggetto;
import org.openspcoop2.core.tracciamento.SoggettoIdentificativo;
import org.openspcoop2.core.tracciamento.TipoData;
import org.openspcoop2.core.tracciamento.Trasmissioni;
import org.openspcoop2.core.tracciamento.constants.TipoInoltro;
import org.openspcoop2.core.tracciamento.constants.TipoProfiloCollaborazione;
import org.openspcoop2.core.tracciamento.constants.TipoTempo;
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.TipoOraRegistrazione;
import org.openspcoop2.utils.date.DateManager;

/**
 * Classe utilizzata per rappresentare una Busta.
 *
 * @author Poli Andrea (apoli@link.it)
 * @author Nardi Lorenzo
 * @author $Author$
 * @version $Rev$, $Date$
 */

public class Busta implements java.io.Serializable { 

	private static final long serialVersionUID = 1L;

	
	// busta
    private org.openspcoop2.core.tracciamento.Busta busta;
	
 
	// servizio [info-richiedente]
	protected String tipoServizioRichiedenteBustaDiServizio;
	protected String servizioRichiedenteBustaDiServizio;
	protected Integer versioneServizioRichiedenteBustaDiServizio;

	// azione [info-richiedente]
	protected String azioneRichiedenteBustaDiServizio;
	
	// identificativi [info-richiedente]
	protected String riferimentoMsgBustaRichiedenteServizio;
	
	// ListaEccezioni
	protected List<Eccezione> listaEccezioni = new ArrayList<>();
	
	// ListaRiscontri
	protected List<Riscontro> listaRiscontri = new ArrayList<>();
	
	// ListaTrasmissioni
	protected List<Trasmissione> listaTrasmissioni = new ArrayList<>();
	
	public Busta(String protocollo){
		
		this.busta = new org.openspcoop2.core.tracciamento.Busta();
		
		this.setSequenza(-1);
		this.setProtocollo(protocollo);
	}

	public Busta(IProtocolFactory<?> protocolFactory,Servizio infoServizio, IDSoggetto mittente, IDSoggetto destinatario, String id, boolean generateListaTrasmissione) throws ProtocolException {
		
		this.busta = new org.openspcoop2.core.tracciamento.Busta();
		
		this.setSequenza(-1);
		
		if(infoServizio!=null){
			this.setProfiloDiCollaborazione(infoServizio.getProfiloDiCollaborazione());
			if(infoServizio.getProfiloDiCollaborazione()!=null){
				this.setProfiloDiCollaborazioneValue(protocolFactory.createTraduttore().toString(infoServizio.getProfiloDiCollaborazione()));
			}
			this.setConfermaRicezione(infoServizio.getConfermaRicezione());
			this.setScadenza(infoServizio.getScadenza());
			if(infoServizio.getIDServizio()!=null){
				this.setTipoServizio(infoServizio.getIDServizio().getTipo());
				this.setServizio(infoServizio.getIDServizio().getNome());
				this.setVersioneServizio(infoServizio.getIDServizio().getVersione());
				this.setAzione(infoServizio.getIDServizio().getAzione());
			}
			this.setTipoServizioCorrelato(infoServizio.getTipoServizioCorrelato());
			this.setServizioCorrelato(infoServizio.getServizioCorrelato());
			if(infoServizio.getInoltro()!=null){
				this.setInoltro(infoServizio.getInoltro());
				this.setInoltroValue(protocolFactory.createTraduttore().toString(infoServizio.getInoltro()));
			}
		}
		
		if(mittente!=null){
			this.setTipoMittente(mittente.getTipo());
			this.setMittente(mittente.getNome());
			this.setIdentificativoPortaMittente(mittente.getCodicePorta());
		}
		
		if(destinatario!=null){
			this.setTipoDestinatario(destinatario.getTipo());
			this.setDestinatario(destinatario.getNome());
			this.setIdentificativoPortaDestinatario(destinatario.getCodicePorta());
		}
		
		this.setID(id);
		if(protocolFactory!=null){
			this.setProtocollo(protocolFactory.getProtocol());
		}
		
		if(generateListaTrasmissione){
			// aggiunto lista trasmissione
			if(this.sizeListaTrasmissioni()<=0){
				Trasmissione trasmissione = new Trasmissione();
				
				if(this.busta.getMittente()!=null){
					if(this.busta.getMittente().getIdentificativo()!=null){
						trasmissione.setTipoOrigine(this.busta.getMittente().getIdentificativo().getTipo());
						trasmissione.setOrigine(this.busta.getMittente().getIdentificativo().getBase());
					}
					trasmissione.setIdentificativoPortaOrigine(this.busta.getMittente().getIdentificativoPorta());
					trasmissione.setIndirizzoOrigine(this.busta.getMittente().getIndirizzo());
				}
				
				if(this.busta.getDestinatario()!=null){
					if(this.busta.getDestinatario().getIdentificativo()!=null){
						trasmissione.setTipoDestinazione(this.busta.getDestinatario().getIdentificativo().getTipo());
						trasmissione.setDestinazione(this.busta.getDestinatario().getIdentificativo().getBase());
					}
					trasmissione.setIdentificativoPortaDestinazione(this.busta.getDestinatario().getIdentificativoPorta());
					trasmissione.setIndirizzoDestinazione(this.busta.getDestinatario().getIndirizzo());
				}
				
				this.addTrasmissione(trasmissione);
			}
		}
	}
	
	public Busta(org.openspcoop2.core.tracciamento.Busta busta){
		this.busta = busta;
		
    	// eccezioni
    	if(busta.getEccezioni()!=null && busta.getEccezioni().sizeEccezioneList()>0){
    		for (org.openspcoop2.core.tracciamento.Eccezione eccezione : busta.getEccezioni().getEccezioneList()) {
    			this.addEccezione(new Eccezione(eccezione),false);
    		}
    	}
    	
    	// riscontri
    	if(busta.getRiscontri()!=null && busta.getRiscontri().sizeRiscontroList()>0){
    		for (org.openspcoop2.core.tracciamento.Riscontro riscontro : busta.getRiscontri().getRiscontroList()) {
    			this.addRiscontro(new Riscontro(riscontro),false);
    		}
    	}
    	
    	// trasmissioni
    	if(busta.getTrasmissioni()!=null && busta.getTrasmissioni().sizeTrasmissioneList()>0){
    		for (org.openspcoop2.core.tracciamento.Trasmissione trasmissione : busta.getTrasmissioni().getTrasmissioneList()) {
    			this.addTrasmissione(new Trasmissione(trasmissione),false);
    		}
    	}
	}

	

	
	// base
	
	public org.openspcoop2.core.tracciamento.Busta getBusta() {
		return this.busta;
	}
	public void setBusta(org.openspcoop2.core.tracciamento.Busta busta) {
		this.busta = busta;
		
    	// eccezioni
    	if(busta.getEccezioni()!=null && busta.getEccezioni().sizeEccezioneList()>0)
    	for (org.openspcoop2.core.tracciamento.Eccezione eccezione : busta.getEccezioni().getEccezioneList()) {
			this.addEccezione(new Eccezione(eccezione),false);
		}
    	
    	// riscontri
    	if(busta.getRiscontri()!=null && busta.getRiscontri().sizeRiscontroList()>0)
    	for (org.openspcoop2.core.tracciamento.Riscontro riscontro : busta.getRiscontri().getRiscontroList()) {
			this.addRiscontro(new Riscontro(riscontro),false);
		}
    	
    	// trasmissioni
    	if(busta.getTrasmissioni()!=null && busta.getTrasmissioni().sizeTrasmissioneList()>0)
    	for (org.openspcoop2.core.tracciamento.Trasmissione trasmissione : busta.getTrasmissioni().getTrasmissioneList()) {
			this.addTrasmissione(new Trasmissione(trasmissione),false);
		}
	}
	
	
	
	// id  [Wrapper]
	
	public Long getId() {
		return this.busta.getId();
	}
	public void setId(Long id) {
		this.busta.setId(id);
	}
	
	
	
	
	
	// mittente [Wrapper]
		
	public String getMittente() {
		if(this.busta.getMittente()!=null && this.busta.getMittente().getIdentificativo()!=null)
			return this.busta.getMittente().getIdentificativo().getBase();
		else
			return null;
	}
	public void setMittente(String value) {
		if(value!=null){
			if(this.busta.getMittente()==null){
				this.busta.setMittente(new Soggetto());
			}
			if(this.busta.getMittente().getIdentificativo()==null){
				this.busta.getMittente().setIdentificativo(new SoggettoIdentificativo());
			}
			this.busta.getMittente().getIdentificativo().setBase(value);
		}
		else{
			if(this.busta.getMittente()!=null){
				if(this.busta.getMittente().getIdentificativo()!=null){
					if(this.busta.getMittente().getIdentificativo().getTipo()==null){
						this.busta.getMittente().setIdentificativo(null);
					}
					else{
						this.busta.getMittente().getIdentificativo().setBase(null);
					}	
				}
				if(this.busta.getMittente().getIdentificativo()==null && 
						this.busta.getMittente().getIdentificativoPorta()==null &&
						this.busta.getMittente().getIndirizzo()==null){
					this.busta.setMittente(null);
				}
			}
		}
	}
	
	public String getTipoMittente() {
		if(this.busta.getMittente()!=null && this.busta.getMittente().getIdentificativo()!=null)
			return this.busta.getMittente().getIdentificativo().getTipo();
		else
			return null;
	}
	public void setTipoMittente(String value) {
		if(value!=null){
			if(this.busta.getMittente()==null){
				this.busta.setMittente(new Soggetto());
			}
			if(this.busta.getMittente().getIdentificativo()==null){
				this.busta.getMittente().setIdentificativo(new SoggettoIdentificativo());
			}
			this.busta.getMittente().getIdentificativo().setTipo(value);
		}
		else{
			if(this.busta.getMittente()!=null){
				if(this.busta.getMittente().getIdentificativo()!=null){
					if(this.busta.getMittente().getIdentificativo().getBase()==null){
						this.busta.getMittente().setIdentificativo(null);
					}
					else{
						this.busta.getMittente().getIdentificativo().setTipo(null);
					}	
				}
				if(this.busta.getMittente().getIdentificativo()==null && 
						this.busta.getMittente().getIdentificativoPorta()==null &&
						this.busta.getMittente().getIndirizzo()==null){
					this.busta.setMittente(null);
				}
			}
		}
	}

	public String getIdentificativoPortaMittente() {
		if(this.busta.getMittente()!=null)
			return this.busta.getMittente().getIdentificativoPorta();
		else
			return null;
	}

	public void setIdentificativoPortaMittente(String identificativoPortaMittente) {
		if(identificativoPortaMittente!=null){
			if(this.busta.getMittente()==null){
				this.busta.setMittente(new Soggetto());
			}
			this.busta.getMittente().setIdentificativoPorta(identificativoPortaMittente);
		}
		else{
			if(this.busta.getMittente()!=null){
				this.busta.getMittente().setIdentificativoPorta(null);
				if(this.busta.getMittente().getIdentificativo()==null && 
						this.busta.getMittente().getIdentificativoPorta()==null &&
						this.busta.getMittente().getIndirizzo()==null){
					this.busta.setMittente(null);
				}
			}
		}
	}
	
	public String getIndirizzoMittente() {
		if(this.busta.getMittente()!=null)
			return this.busta.getMittente().getIndirizzo();
		else
			return null;
	}
	public void setIndirizzoMittente(String value) {
		if(value!=null){
			if(this.busta.getMittente()==null){
				this.busta.setMittente(new Soggetto());
			}
			this.busta.getMittente().setIndirizzo(value);
		}
		else{
			if(this.busta.getMittente()!=null){
				this.busta.getMittente().setIndirizzo(null);
				if(this.busta.getMittente().getIdentificativo()==null && 
						this.busta.getMittente().getIdentificativoPorta()==null &&
						this.busta.getMittente().getIndirizzo()==null){
					this.busta.setMittente(null);
				}
			}
		}
	}
	
	
	
	
	// destinatario [Wrapper]
	
	public String getDestinatario() {
		if(this.busta.getDestinatario()!=null && this.busta.getDestinatario().getIdentificativo()!=null)
			return this.busta.getDestinatario().getIdentificativo().getBase();
		else
			return null;
	}
	public void setDestinatario(String value) {
		if(value!=null){
			if(this.busta.getDestinatario()==null){
				this.busta.setDestinatario(new Soggetto());
			}
			if(this.busta.getDestinatario().getIdentificativo()==null){
				this.busta.getDestinatario().setIdentificativo(new SoggettoIdentificativo());
			}
			this.busta.getDestinatario().getIdentificativo().setBase(value);
		}
		else{
			if(this.busta.getDestinatario()!=null){
				if(this.busta.getDestinatario().getIdentificativo()!=null){
					if(this.busta.getDestinatario().getIdentificativo().getTipo()==null){
						this.busta.getDestinatario().setIdentificativo(null);
					}
					else{
						this.busta.getDestinatario().getIdentificativo().setBase(null);
					}	
				}
				if(this.busta.getDestinatario().getIdentificativo()==null && 
						this.busta.getDestinatario().getIdentificativoPorta()==null &&
						this.busta.getDestinatario().getIndirizzo()==null){
					this.busta.setDestinatario(null);
				}
			}
		}
	}

	public String getTipoDestinatario() {
		if(this.busta.getDestinatario()!=null && this.busta.getDestinatario().getIdentificativo()!=null)
			return this.busta.getDestinatario().getIdentificativo().getTipo();
		else
			return null;
	}
	public void setTipoDestinatario(String value) {
		if(value!=null){
			if(this.busta.getDestinatario()==null){
				this.busta.setDestinatario(new Soggetto());
			}
			if(this.busta.getDestinatario().getIdentificativo()==null){
				this.busta.getDestinatario().setIdentificativo(new SoggettoIdentificativo());
			}
			this.busta.getDestinatario().getIdentificativo().setTipo(value);
		}else{
			if(this.busta.getDestinatario()!=null){
				if(this.busta.getDestinatario().getIdentificativo()!=null){
					if(this.busta.getDestinatario().getIdentificativo().getBase()==null){
						this.busta.getDestinatario().setIdentificativo(null);
					}
					else{
						this.busta.getDestinatario().getIdentificativo().setTipo(null);
					}	
				}
				if(this.busta.getDestinatario().getIdentificativo()==null && 
						this.busta.getDestinatario().getIdentificativoPorta()==null &&
						this.busta.getDestinatario().getIndirizzo()==null){
					this.busta.setDestinatario(null);
				}
			}
		}
	}
	
	public String getIdentificativoPortaDestinatario() {
		if(this.busta.getDestinatario()!=null)
			return this.busta.getDestinatario().getIdentificativoPorta();
		else
			return null;
	}

	public void setIdentificativoPortaDestinatario(
			String identificativoPortaDestinatario) {
		if(identificativoPortaDestinatario!=null){
			if(this.busta.getDestinatario()==null){
				this.busta.setDestinatario(new Soggetto());
			}
			this.busta.getDestinatario().setIdentificativoPorta(identificativoPortaDestinatario);
		}
		else{
			if(this.busta.getDestinatario()!=null){
				this.busta.getDestinatario().setIdentificativoPorta(null);
				if(this.busta.getDestinatario().getIdentificativo()==null && 
						this.busta.getDestinatario().getIdentificativoPorta()==null &&
						this.busta.getDestinatario().getIndirizzo()==null){
					this.busta.setDestinatario(null);
				}
			}
		}
	}
	
	public String getIndirizzoDestinatario() {
		if(this.busta.getDestinatario()!=null)
			return this.busta.getDestinatario().getIndirizzo();
		else
			return null;
	}
	public void setIndirizzoDestinatario(String value) {
		if(value!=null){
			if(this.busta.getDestinatario()==null){
				this.busta.setDestinatario(new Soggetto());
			}
			this.busta.getDestinatario().setIndirizzo(value);
		}else{
			if(this.busta.getDestinatario()!=null){
				this.busta.getDestinatario().setIndirizzo(null);
				if(this.busta.getDestinatario().getIdentificativo()==null && 
						this.busta.getDestinatario().getIdentificativoPorta()==null &&
						this.busta.getDestinatario().getIndirizzo()==null){
					this.busta.setDestinatario(null);
				}
			}
		}
	}

	
	
	// profilo di collaborazione [Wrapper]
	
	public ProfiloDiCollaborazione getProfiloDiCollaborazione() {
		if(this.busta.getProfiloCollaborazione()!=null && this.busta.getProfiloCollaborazione().getTipo()!=null){
			switch (this.busta.getProfiloCollaborazione().getTipo()) {
			case ONEWAY:
				return ProfiloDiCollaborazione.ONEWAY;
			case SINCRONO:
				return ProfiloDiCollaborazione.SINCRONO;
			case ASINCRONO_ASIMMETRICO:
				return ProfiloDiCollaborazione.ASINCRONO_ASIMMETRICO;
			case ASINCRONO_SIMMETRICO:
				return ProfiloDiCollaborazione.ASINCRONO_SIMMETRICO;
			case SCONOSCIUTO:
				return ProfiloDiCollaborazione.UNKNOWN;
			}
		}
		return null;
	}
	public void setProfiloDiCollaborazione(ProfiloDiCollaborazione value) {
		if(value!=null){
			if(this.busta.getProfiloCollaborazione()==null){
				this.busta.setProfiloCollaborazione(new ProfiloCollaborazione());
			}
			switch (value) {
			case ONEWAY:
				this.busta.getProfiloCollaborazione().setTipo(TipoProfiloCollaborazione.ONEWAY);
				break;
			case SINCRONO:
				this.busta.getProfiloCollaborazione().setTipo(TipoProfiloCollaborazione.SINCRONO);
				break;
			case ASINCRONO_ASIMMETRICO:
				this.busta.getProfiloCollaborazione().setTipo(TipoProfiloCollaborazione.ASINCRONO_ASIMMETRICO);
				break;
			case ASINCRONO_SIMMETRICO:
				this.busta.getProfiloCollaborazione().setTipo(TipoProfiloCollaborazione.ASINCRONO_SIMMETRICO);
				break;
			case UNKNOWN:
				this.busta.getProfiloCollaborazione().setTipo(TipoProfiloCollaborazione.SCONOSCIUTO);
				break;
			}
		}
		else{
			if(this.busta.getProfiloCollaborazione()!=null){
				if(this.busta.getProfiloCollaborazione().getBase()==null){
					this.busta.setProfiloCollaborazione(null);
				}
				else{
					this.busta.getProfiloCollaborazione().setTipo(null);
				}
			}
		}
		
	}
	
	public void setProfiloDiCollaborazione(ProfiloDiCollaborazione profiloDiCollaborazione, String value) {
		this.setProfiloDiCollaborazione(profiloDiCollaborazione);
		this.setProfiloDiCollaborazioneValue(value);
	}
	
	public String getProfiloDiCollaborazioneValue() {
		if(this.busta.getProfiloCollaborazione()!=null){
			return this.busta.getProfiloCollaborazione().getBase();
		}
		return null;
	}
	public void setProfiloDiCollaborazioneValue(String profiloDiCollaborazioneValue) {
		if(profiloDiCollaborazioneValue!=null){
			if(this.busta.getProfiloCollaborazione()==null){
				this.busta.setProfiloCollaborazione(new ProfiloCollaborazione());
			}
			this.busta.getProfiloCollaborazione().setBase(profiloDiCollaborazioneValue);
		}else{
			if(this.busta.getProfiloCollaborazione()!=null){
				if(this.busta.getProfiloCollaborazione().getTipo()==null){
					this.busta.setProfiloCollaborazione(null);
				}
				else{
					this.busta.getProfiloCollaborazione().setBase(null);
				}
			}
		}
	}
	
	public String getServizioCorrelato() {
		if(this.busta.getServizioCorrelato()!=null){
			return this.busta.getServizioCorrelato().getBase();
		}
		return null;
	}
	public void setServizioCorrelato(String value) {
		if(value!=null){
			if(this.busta.getServizioCorrelato()==null){
				this.busta.setServizioCorrelato(new org.openspcoop2.core.tracciamento.Servizio());
			}
			this.busta.getServizioCorrelato().setBase(value);
		}else{
			if(this.busta.getServizioCorrelato()!=null){
				this.busta.getServizioCorrelato().setBase(null);
				if(this.busta.getServizioCorrelato().getTipo()==null &&
						(this.busta.getServizioCorrelato().getVersione()==null || this.busta.getServizioCorrelato().getVersione()==1)){
					this.busta.setServizioCorrelato(null);
				}
			}
		}
	}
	
	public String getTipoServizioCorrelato() {
		if(this.busta.getServizioCorrelato()!=null){
			return this.busta.getServizioCorrelato().getTipo();
		}
		return null;
	}
	public void setTipoServizioCorrelato(String value) {
		if(value!=null){
			if(this.busta.getServizioCorrelato()==null){
				this.busta.setServizioCorrelato(new org.openspcoop2.core.tracciamento.Servizio());
			}
			this.busta.getServizioCorrelato().setTipo(value);
		}else{
			if(this.busta.getServizioCorrelato()!=null){
				this.busta.getServizioCorrelato().setTipo(null);
				if(this.busta.getServizioCorrelato().getBase()==null &&
						(this.busta.getServizioCorrelato().getVersione()==null || this.busta.getServizioCorrelato().getVersione()==1)){
					this.busta.setServizioCorrelato(null);
				}
			}
		}
	}
	
	public Integer getVersioneServizioCorrelato() {
		if(this.busta.getServizioCorrelato()!=null){
			return this.busta.getServizioCorrelato().getVersione();
		}
		return null;
	}
	public void setVersioneServizioCorrelato(Integer value) {
		if(value!=null){
			if(this.busta.getServizioCorrelato()==null){
				this.busta.setServizioCorrelato(new org.openspcoop2.core.tracciamento.Servizio());
			}
			this.busta.getServizioCorrelato().setVersione(value);
		}else{
			if(this.busta.getServizioCorrelato()!=null){
				this.busta.getServizioCorrelato().setVersione(null);
				if(this.busta.getServizioCorrelato().getBase()==null &&
						this.busta.getServizioCorrelato().getTipo()==null){
					this.busta.setServizioCorrelato(null);
				}
			}
		}
	}
	

	
	
	// collaborazione [Wrapper]
	
	public String getCollaborazione() {
		return this.busta.getCollaborazione();
	}
	public void setCollaborazione(String value) {
		this.busta.setCollaborazione(value);
	}
	
	
		
	// servizio
	
	public String getServizio() {
		if(this.busta.getServizio()!=null){
			return this.busta.getServizio().getBase();
		}
		return null;
	}
	public void setServizio(String value) {
		if(value!=null){
			if(this.busta.getServizio()==null){
				this.busta.setServizio(new org.openspcoop2.core.tracciamento.Servizio());
			}
			this.busta.getServizio().setBase(value);
		}else{
			if(this.busta.getServizio()!=null){
				this.busta.getServizio().setBase(null);
				if(this.busta.getServizio().getTipo()==null &&
						(this.busta.getServizio().getVersione()==null || this.busta.getServizio().getVersione()==1)){
					this.busta.setServizio(null);
				}
			}
		}
	}

	public String getTipoServizio() {
		if(this.busta.getServizio()!=null){
			return this.busta.getServizio().getTipo();
		}
		return null;
	}
	public void setTipoServizio(String value) {
		if(value!=null){
			if(this.busta.getServizio()==null){
				this.busta.setServizio(new org.openspcoop2.core.tracciamento.Servizio());
			}
			this.busta.getServizio().setTipo(value);
		}else{
			if(this.busta.getServizio()!=null){
				this.busta.getServizio().setTipo(null);
				if(this.busta.getServizio().getBase()==null &&
						(this.busta.getServizio().getVersione()==null || this.busta.getServizio().getVersione()==1)){
					this.busta.setServizio(null);
				}
			}
		}
	}

	public Integer getVersioneServizio() {
		if(this.busta.getServizio()!=null && this.busta.getServizio().getVersione()!=null){
			return this.busta.getServizio().getVersione();
		}
		return 1;
	}
	public void setVersioneServizio(Integer versioneServizio) {
		if(this.busta.getServizio()==null){
			this.busta.setServizio(new org.openspcoop2.core.tracciamento.Servizio());
		}
		this.busta.getServizio().setVersione(versioneServizio);
	}
	
	
	
	// servizio [info-richiedente]
	
	public String getTipoServizioRichiedenteBustaDiServizio() {
		return this.tipoServizioRichiedenteBustaDiServizio;
	}
	public void setTipoServizioRichiedenteBustaDiServizio(String value) {
		this.tipoServizioRichiedenteBustaDiServizio = value;
	}
	
	public String getServizioRichiedenteBustaDiServizio() {
		return this.servizioRichiedenteBustaDiServizio;
	}
	public void setServizioRichiedenteBustaDiServizio(String value) {
		this.servizioRichiedenteBustaDiServizio = value;
	}
	
	public Integer getVersioneServizioRichiedenteBustaDiServizio() {
		return this.versioneServizioRichiedenteBustaDiServizio;
	}

	public void setVersioneServizioRichiedenteBustaDiServizio(Integer versioneServizioRichiedenteBustaDiServizio) {
		this.versioneServizioRichiedenteBustaDiServizio = versioneServizioRichiedenteBustaDiServizio;
	}
	
	
	
	// azione [wrapped] 
		
	public String getAzione() {
		return this.busta.getAzione();
	}
	public void setAzione(String value) {
		this.busta.setAzione(value);
	}
	
	
	
	// azione [info-richiedente]
	
	public String getAzioneRichiedenteBustaDiServizio() {
		return this.azioneRichiedenteBustaDiServizio;
	}
	public void setAzioneRichiedenteBustaDiServizio(String value) {
		this.azioneRichiedenteBustaDiServizio = value;
	}
	
	
	
	
	// identificativi [wrapped]
	
	public String getID() {
		return this.busta.getIdentificativo();
	}
	public void setID(String value) {
		this.busta.setIdentificativo(value);
	}
	
	public String getRiferimentoMessaggio() {
		return this.busta.getRiferimentoMessaggio();
	}
	public void setRiferimentoMessaggio(String value) {
		this.busta.setRiferimentoMessaggio(value);
	}

	
	
	// identificativi [info-richiedente]
	
	public String getRiferimentoMsgBustaRichiedenteServizio() {
		return this.riferimentoMsgBustaRichiedenteServizio;
	}
	public void setRiferimentoMsgBustaRichiedenteServizio(String value) {
		this.riferimentoMsgBustaRichiedenteServizio = value;
	}
	

	
	// date [wrapped]
	
	public TipoOraRegistrazione getTipoOraRegistrazione() {
		if(this.busta.getOraRegistrazione()!=null && 
				this.busta.getOraRegistrazione().getSorgente()!=null &&
				this.busta.getOraRegistrazione().getSorgente().getTipo()!=null){
			switch (this.busta.getOraRegistrazione().getSorgente().getTipo()) {
			case LOCALE:
				return TipoOraRegistrazione.LOCALE;
			case SINCRONIZZATO:
				return TipoOraRegistrazione.SINCRONIZZATO;
			case SCONOSCIUTO:
				return TipoOraRegistrazione.UNKNOWN;
			}
		}
		return null;
	}
	protected void setTipoOraRegistrazione(TipoOraRegistrazione tipoOraRegistrazione) {
		if(tipoOraRegistrazione!=null){
			if(this.busta.getOraRegistrazione()==null){
				this.busta.setOraRegistrazione(new Data());
			}
			if(this.busta.getOraRegistrazione().getSorgente()==null){
				this.busta.getOraRegistrazione().setSorgente(new TipoData());
			}
			switch (tipoOraRegistrazione) {
			case LOCALE:
				this.busta.getOraRegistrazione().getSorgente().setTipo(TipoTempo.LOCALE);
				break;
			case SINCRONIZZATO:
				this.busta.getOraRegistrazione().getSorgente().setTipo(TipoTempo.SINCRONIZZATO);
				break;
			case UNKNOWN:
				this.busta.getOraRegistrazione().getSorgente().setTipo(TipoTempo.SCONOSCIUTO);
				break;
			}
		}
		else {
			if(this.busta.getOraRegistrazione()!=null){
				if(this.busta.getOraRegistrazione().getSorgente()!=null){
					if(this.busta.getOraRegistrazione().getSorgente().getBase()==null){
						this.busta.getOraRegistrazione().setSorgente(null);
					}
					else{
						this.busta.getOraRegistrazione().getSorgente().setTipo(null);
					}	
				}
				if(this.busta.getOraRegistrazione().getSorgente()==null && this.busta.getOraRegistrazione().getDateTime()==null){
					this.busta.setOraRegistrazione(null);
				}
			}
		}
	}
	
	public void setTipoOraRegistrazione(TipoOraRegistrazione tipo, String value) {
		this.setTipoOraRegistrazione(tipo);
		this.setTipoOraRegistrazioneValue(value);
	}

	public String getTipoOraRegistrazioneValue() {
		if(this.busta.getOraRegistrazione()!=null && 
				this.busta.getOraRegistrazione().getSorgente()!=null){
			return this.busta.getOraRegistrazione().getSorgente().getBase();
		}
		return null;
	}
	public void setTipoOraRegistrazioneValue(String tipoOraRegistrazioneValue) {
		if(tipoOraRegistrazioneValue!=null){
			if(this.busta.getOraRegistrazione()==null){
				this.busta.setOraRegistrazione(new Data());
			}
			if(this.busta.getOraRegistrazione().getSorgente()==null){
				this.busta.getOraRegistrazione().setSorgente(new TipoData());
			}
			this.busta.getOraRegistrazione().getSorgente().setBase(tipoOraRegistrazioneValue);
		}
		else {
			if(this.busta.getOraRegistrazione()!=null){
				if(this.busta.getOraRegistrazione().getSorgente()!=null){
					if(this.busta.getOraRegistrazione().getSorgente().getTipo()==null){
						this.busta.getOraRegistrazione().setSorgente(null);
					}
					else{
						this.busta.getOraRegistrazione().getSorgente().setBase(null);
					}	
				}
				if(this.busta.getOraRegistrazione().getSorgente()==null && this.busta.getOraRegistrazione().getDateTime()==null){
					this.busta.setOraRegistrazione(null);
				}
			}
		}
	}
		
	public Date getOraRegistrazione() {
		if(this.busta.getOraRegistrazione()!=null){
			return this.busta.getOraRegistrazione().getDateTime();
		}
		return null;
	}
	public void setOraRegistrazione(Date value) {
		if(value!=null){
			if(this.busta.getOraRegistrazione()==null){
				this.busta.setOraRegistrazione(new Data());
			}
			this.busta.getOraRegistrazione().setDateTime(value);
		}
		else {
			if(this.busta.getOraRegistrazione()!=null){
				if(this.busta.getOraRegistrazione().getSorgente()==null){
					this.busta.setOraRegistrazione(null);
				}
				else{
					this.busta.getOraRegistrazione().setDateTime(null);
				}
			}
		}
	}

	public Date getScadenza() {
		return this.busta.getScadenza();
	}
	public void setScadenza(Date value) {
		this.busta.setScadenza(value);
	}
	
		
	
	
	
	// profilo di trasmissione [wrapped]

	public boolean isConfermaRicezione() {
		if(this.busta.getProfiloTrasmissione()!=null){
			return this.busta.getProfiloTrasmissione().getConfermaRicezione();
		}
		return false;
	}
	public void setConfermaRicezione(boolean value) {
		if(this.busta.getProfiloTrasmissione()==null){
			this.busta.setProfiloTrasmissione(new ProfiloTrasmissione());
		}
		this.busta.getProfiloTrasmissione().setConfermaRicezione(value);
	}

	public Inoltro getInoltro() {
		if(this.busta.getProfiloTrasmissione()!=null && 
				this.busta.getProfiloTrasmissione().getInoltro()!=null &&
				this.busta.getProfiloTrasmissione().getInoltro().getTipo()!=null){
			switch (this.busta.getProfiloTrasmissione().getInoltro().getTipo()) {
			case INOLTRO_CON_DUPLICATI:
				return Inoltro.CON_DUPLICATI;
			case INOLTRO_SENZA_DUPLICATI:
				return Inoltro.SENZA_DUPLICATI;
			case SCONOSCIUTO:
				return Inoltro.UNKNOWN;
			}
		}
		return null;
	}
	protected void setInoltro(Inoltro inoltro) {
		if(inoltro!=null){
			if(this.busta.getProfiloTrasmissione()==null){
				this.busta.setProfiloTrasmissione(new ProfiloTrasmissione());
			}
			if(this.busta.getProfiloTrasmissione().getInoltro()==null){
				this.busta.getProfiloTrasmissione().setInoltro(new org.openspcoop2.core.tracciamento.Inoltro());
			}
			switch (inoltro) {
			case CON_DUPLICATI:
				this.busta.getProfiloTrasmissione().getInoltro().setTipo(TipoInoltro.INOLTRO_CON_DUPLICATI);
				break;
			case SENZA_DUPLICATI:
				this.busta.getProfiloTrasmissione().getInoltro().setTipo(TipoInoltro.INOLTRO_SENZA_DUPLICATI);
				break;
			case UNKNOWN:
				this.busta.getProfiloTrasmissione().getInoltro().setTipo(TipoInoltro.SCONOSCIUTO);
				break;
			}
		}
		else{
			if(this.busta.getProfiloTrasmissione()!=null){
				if(this.busta.getProfiloTrasmissione().getInoltro()!=null){
					if(this.getBusta().getProfiloTrasmissione().getInoltro().getBase()!=null){
						this.busta.getProfiloTrasmissione().getInoltro().setTipo(null);
					}
					else{
						this.busta.getProfiloTrasmissione().setInoltro(null);
					}		
				}
			}
		}
	}
	
	public void setInoltro(Inoltro inoltro, String value) {
		this.setInoltro(inoltro);
		this.setInoltroValue(value);
	}
	
	public String getInoltroValue() {
		if(this.busta.getProfiloTrasmissione()!=null && 
				this.busta.getProfiloTrasmissione().getInoltro()!=null){
			return this.busta.getProfiloTrasmissione().getInoltro().getBase();
		}
		return null;
	}
	public void setInoltroValue(String inoltroValue) {
		if(inoltroValue!=null){
			if(this.busta.getProfiloTrasmissione()==null){
				this.busta.setProfiloTrasmissione(new ProfiloTrasmissione());
			}
			if(this.busta.getProfiloTrasmissione().getInoltro()==null){
				this.busta.getProfiloTrasmissione().setInoltro(new org.openspcoop2.core.tracciamento.Inoltro());
			}
			this.busta.getProfiloTrasmissione().getInoltro().setBase(inoltroValue);
		}
		else{
			if(this.busta.getProfiloTrasmissione()!=null){
				if(this.busta.getProfiloTrasmissione().getInoltro()!=null){
					if(this.getBusta().getProfiloTrasmissione().getInoltro().getTipo()!=null){
						this.busta.getProfiloTrasmissione().getInoltro().setBase(null);
					}
					else{
						this.busta.getProfiloTrasmissione().setInoltro(null);
					}		
				}
			}
		}
	}
	
	
	
	
	// sequenza [wrapped]
	
	public long getSequenza() {
		if(this.busta.getProfiloTrasmissione()!=null &&
				this.busta.getProfiloTrasmissione().getSequenza()!=null){
			return this.busta.getProfiloTrasmissione().getSequenza();
		}
		return -1;
	}
	public void setSequenza(long value) {
		if(value>=0){
			if(this.busta.getProfiloTrasmissione()==null){
				this.busta.setProfiloTrasmissione(new ProfiloTrasmissione());
			}
			this.busta.getProfiloTrasmissione().setSequenza(Long.valueOf(value+"").intValue());
		}
		else{
			if(this.busta.getProfiloTrasmissione()!=null){
				this.busta.getProfiloTrasmissione().setSequenza(null);
			}
		}
	}




	
	// servizi applicativi
	
	public String getServizioApplicativoFruitore() {
		return this.busta.getServizioApplicativoFruitore();
	}
	public void setServizioApplicativoFruitore(String servizioApplicativoFruitore) {
		this.busta.setServizioApplicativoFruitore(servizioApplicativoFruitore);
	}

	public String getServizioApplicativoErogatore() {
		return this.busta.getServizioApplicativoErogatore();
	}
	public void setServizioApplicativoErogatore(String servizioApplicativoErogatore) {
		this.busta.setServizioApplicativoErogatore(servizioApplicativoErogatore);
	}
	

	
	
	// protocollo [wrapped]
	
	public String getProtocollo() {
		if(this.busta.getProtocollo()!=null){
			return this.busta.getProtocollo().getIdentificativo();
		}
		return null;
	}
	public void setProtocollo(String protocollo) {
		if(protocollo!=null){
			if(this.busta.getProtocollo()==null){
				this.busta.setProtocollo(new Protocollo());
			}
			this.busta.getProtocollo().setIdentificativo(protocollo);
		}
		else{
			if(this.busta.getProtocollo()!=null){
				if(this.busta.getProtocollo().sizeProprietaList()<=0){
					this.busta.setProtocollo(null);
				}
				else{
					this.busta.getProtocollo().setIdentificativo(null);
				}
			}
		}
	}


	
	
	// digest [wrapped]
	
	public String getDigest() {
		return this.busta.getDigest();
	}
	public void setDigest(String digest) {
		this.busta.setDigest(digest);
	}
	

		
	// properties [wrapped]
	
	public void addProperty(String key,String value){
		// Per evitare nullPointer durante la serializzazione
		// Non deve essere inserito nemmeno il valore ""
		if(value!=null && !"".equals(value)){
			if(this.busta.getProtocollo()==null){
				this.busta.setProtocollo(new Protocollo());
			}
			Proprieta proprieta = new Proprieta();
			proprieta.setNome(key);
			proprieta.setValore(value);
			this.removeProperty(key); // per evitare doppioni
			this.busta.getProtocollo().addProprieta(proprieta);
		}
	}

	public int sizeProperties(){
		if(this.busta.getProtocollo()!=null){
			return this.busta.getProtocollo().sizeProprietaList();
		}
		return 0;
	}

	public boolean existsProperty(String key){
		if(this.busta.getProtocollo()!=null){
			for (int i = 0; i < this.busta.getProtocollo().sizeProprietaList(); i++) {
				Proprieta proprieta = this.busta.getProtocollo().getProprieta(i);
				if(proprieta.getNome().equals(key)){
					return true;
				}
			}
		}
		return false;
	}
	
	public String getProperty(String key){
		if(this.busta.getProtocollo()!=null){
			for (int i = 0; i < this.busta.getProtocollo().sizeProprietaList(); i++) {
				Proprieta proprieta = this.busta.getProtocollo().getProprieta(i);
				if(proprieta.getNome().equals(key)){
					return proprieta.getValore();
				}
			}
		}
		return null;
	}

	public String removeProperty(String key){
		if(this.busta.getProtocollo()!=null){
			for (int i = 0; i < this.busta.getProtocollo().sizeProprietaList(); i++) {
				Proprieta proprieta = this.busta.getProtocollo().getProprieta(i);
				if(proprieta.getNome().equals(key)){
					this.busta.getProtocollo().removeProprieta(i);
					return proprieta.getValore();
				}
			}
		}
		return null;
	}

	public String[] getPropertiesValues() {
		List<String> propertiesValues = new ArrayList<>();
		if(this.busta.getProtocollo()!=null){
			for (int i = 0; i < this.busta.getProtocollo().sizeProprietaList(); i++) {
				Proprieta proprieta = this.busta.getProtocollo().getProprieta(i);
				propertiesValues.add(proprieta.getValore());
			}
		}
		if(propertiesValues.size()>0){
			return propertiesValues.toArray(new String[1]);
		}
		else{
			return null;
		}
	}

	public String[] getPropertiesNames() {
		List<String> propertiesValues = new ArrayList<>();
		if(this.busta.getProtocollo()!=null){
			for (int i = 0; i < this.busta.getProtocollo().sizeProprietaList(); i++) {
				Proprieta proprieta = this.busta.getProtocollo().getProprieta(i);
				propertiesValues.add(proprieta.getNome());
			}
		}
		if(propertiesValues.size()>0){
			return propertiesValues.toArray(new String[1]);
		}
		else{
			return null;
		}
	}

	// Non devono essere usati.
	// Altrimenti poi se viene effettuato una add o remove sulla lista o hashtable ritornata, la modifica non ha effetto
//	public void setProperties(Map<String, String> params) {
//		Enumeration<String> keys = params.keys();
//		while (keys.hasMoreElements()) {
//			String key = (String) keys.nextElement();
//			this.addProperty(key, params.get(key));
//		}
//	}
//
//	public Map<String, String> getProperties() {
//		Map<String, String> map = new HashMap<>();
//		if(this.busta.getProtocollo()!=null){
//			for (int i = 0; i < this.busta.getProtocollo().sizeProprietaList(); i++) {
//				Proprieta proprieta = this.busta.getProtocollo().getProprieta(i);
//				map.put(proprieta.getNome(), proprieta.getValore());
//			}
//		}
//		return map;
//	}
//	
//	public List<Map.Entry<String, String>> getPropertiesAsList(){
//		List <Map.Entry<String, String>> toRet = new ArrayList<Map.Entry<String, String>>();
//		toRet.addAll(this.getProperties().entrySet());
//		return toRet;
//	}





	
	// ListaEccezioni
		
	public List<Eccezione> getListaEccezioni() {
		return this.listaEccezioni;
	}

	public int sizeListaEccezioni() {
		return this.listaEccezioni.size();
	}

	public List<Eccezione> cloneListaEccezioni() {
		if(this.listaEccezioni!=null){
			List<Eccezione> eccs = new ArrayList<>();
			for(int i=0; i<this.sizeListaEccezioni(); i++){
				eccs.add(this.getEccezione(i).newInstance());
			}
			return eccs;
		}else{
			return null;
		}
	}

	public Eccezione getEccezione(int index) {
		return this.listaEccezioni.get( index );
	}

	public void addEccezione(Eccezione e) {
		this.addEccezione(e, true);
	}
	private void addEccezione(Eccezione e, boolean addCore) {
		this.listaEccezioni.add(e);
		if(addCore){
			if(this.busta.getEccezioni()==null){
				this.busta.setEccezioni(new Eccezioni());
			}
			this.busta.getEccezioni().addEccezione(e.getEccezione());
		}
	}

	public Eccezione removeEccezione(int index) {
		this.busta.getEccezioni().removeEccezione(index);
		return this.listaEccezioni.remove(index);
	}

	public String toStringListaEccezioni(IProtocolFactory<?> protocolFactory) throws ProtocolException{
		if(this.sizeListaEccezioni()>0){
			StringBuilder bf = new StringBuilder();
			for(int i=0; i<this.sizeListaEccezioni(); i++){
				if(i>0)
					bf.append("\n");
				bf.append(this.getEccezione(i).toString(protocolFactory));
			}
			return bf.toString();
		}else{
			return null;
		}
	}

	public String toStringListaEccezioni_erroriNonGravi(IProtocolFactory<?> protocolFactory) throws ProtocolException{
		if(this.sizeListaEccezioni()>0){
			StringBuilder bf = new StringBuilder();
			for(int i=0; i<this.sizeListaEccezioni(); i++){
				if(LivelloRilevanza.isEccezioneLivelloGrave(this.getEccezione(i).getRilevanza()) == false){
					if(i>0)
						bf.append("\n");
					bf.append(this.getEccezione(i).toString(protocolFactory));
				}
			}
			return bf.toString();
		}else{
			return null;
		}
	}

	public String toStringListaEccezioni_erroriGravi(IProtocolFactory<?> protocolFactory) throws ProtocolException{
		if(this.sizeListaEccezioni()>0){
			StringBuilder bf = new StringBuilder();
			for(int i=0; i<this.sizeListaEccezioni(); i++){
				if(LivelloRilevanza.isEccezioneLivelloGrave(this.getEccezione(i).getRilevanza())){
					if(i>0)
						bf.append("\n");
					bf.append(this.getEccezione(i).toString(protocolFactory));
				}
			}
			return bf.toString();
		}else{
			return null;
		}
	}

	public boolean containsEccezioniGravi(){
		for(int i=0; i<this.sizeListaEccezioni(); i++){
			if(LivelloRilevanza.isEccezioneLivelloGrave(this.getEccezione(i).getRilevanza())){
				return true;
			}
		}
		return false;
	}

	public static String toStringListaEccezioni(java.util.List<Eccezione> errors, IProtocolFactory<?> protocolFactory) throws ProtocolException{
		if(errors.size()>0){
			StringBuilder bf = new StringBuilder();
			for(int i=0; i<errors.size(); i++){
				if(i>0)
					bf.append("\n");
				bf.append(errors.get(i).toString(protocolFactory));
			}
			return bf.toString();
		}else{
			return null;
		}
	}

	public static String toStringListaEccezioni_erroriNonGravi(java.util.List<Eccezione> errors, IProtocolFactory<?> protocolFactory) throws ProtocolException{
		if(errors.size()>0){
			StringBuilder bf = new StringBuilder();
			for(int i=0; i<errors.size(); i++){
				if(LivelloRilevanza.isEccezioneLivelloGrave(errors.get(i).getRilevanza()) == false){
					if(i>0)
						bf.append("\n");
					bf.append(errors.get(i).toString(protocolFactory));
				}
			}
			return bf.toString();
		}else{
			return null;
		}
	}

	public static String toStringListaEccezioni_erroriGravi(java.util.List<Eccezione> errors, IProtocolFactory<?> protocolFactory) throws ProtocolException{
		if(errors.size()>0){
			StringBuilder bf = new StringBuilder();
			for(int i=0; i<errors.size(); i++){
				if(LivelloRilevanza.isEccezioneLivelloGrave(errors.get(i).getRilevanza())){
					if(i>0)
						bf.append("\n");
					bf.append(errors.get(i).toString(protocolFactory));
				}
			}
			return bf.toString();
		}else{
			return null;
		}
	}

	public static boolean containsEccezioniGravi(java.util.List<Eccezione> errors){
		for(int i=0; i<errors.size(); i++){
			if(LivelloRilevanza.isEccezioneLivelloGrave(errors.get(i).getRilevanza())){
				return true;
			}
		}
		return false;

	}
	
	
	
	
	
	// ListaRiscontri

	public List<Riscontro> getListaRiscontri() {
		if (this.listaRiscontri == null) {
			this.listaRiscontri = new ArrayList<>();
		}
		return this.listaRiscontri;
	}
	
	public int sizeListaRiscontri() {
		return this.listaRiscontri.size();
	}	

	public Riscontro getRiscontro(int index) {
		return this.listaRiscontri.get( index );
	}
	
	public void addRiscontro(Riscontro r) {
		this.addRiscontro(r, true);
	}
	private void addRiscontro(Riscontro r, boolean addCore) {
		this.listaRiscontri.add(r);
		if(addCore){
			if(this.busta.getRiscontri()==null){
				this.busta.setRiscontri(new Riscontri());
			}
			this.busta.getRiscontri().addRiscontro(r.getRiscontro());
		}
	}
	
	public Riscontro removeRiscontro(int index) {
		this.busta.getRiscontri().removeRiscontro(index);
		return this.listaRiscontri.remove(index);
	}
	
	
	
	
	// ListaTrasmissioni
	
	public List<Trasmissione> getListaTrasmissioni() {
		if (this.listaTrasmissioni == null) {
			this.listaTrasmissioni = new ArrayList<>();
		}
		return this.listaTrasmissioni;
	}
	
	public int sizeListaTrasmissioni() {
		return this.listaTrasmissioni.size();
	}
	
	public Trasmissione getTrasmissione(int index) {
		return this.listaTrasmissioni.get( index );
	}

	public void addTrasmissione(Trasmissione t) {
		this.addTrasmissione(t, true);
	}
	private void addTrasmissione(Trasmissione t, boolean addCore) {
		this.listaTrasmissioni.add(t);
		if(addCore){
			if(this.busta.getTrasmissioni()==null){
				this.busta.setTrasmissioni(new Trasmissioni());
			}
			this.busta.getTrasmissioni().addTrasmissione(t.getTrasmissione());
		}
	}

	public Trasmissione removeTrasmissione(int index) {
		this.busta.getTrasmissioni().removeTrasmissione(index);
		return this.listaTrasmissioni.remove(index);
	}














	/**
	 * Data una busta, genera la corrispondente busta di risposta
	 * Inverte mittente con destinatario.
	 * Setta una nuova ora di registrazione
	 *
	 * @return una busta utilizzabile come risposta
	 * 
	 */
	public Busta invertiBusta(TipoOraRegistrazione tipoOraRegistrazione, String tipoTempo){
		Busta bustaHTTPReply = null;
		bustaHTTPReply = new Busta(this.getProtocollo());

		bustaHTTPReply.setTipoDestinatario(this.getTipoMittente());
		bustaHTTPReply.setDestinatario(this.getMittente());
		bustaHTTPReply.setIdentificativoPortaDestinatario(this.getIdentificativoPortaMittente());
		bustaHTTPReply.setIndirizzoDestinatario(this.getIndirizzoMittente());

		bustaHTTPReply.setTipoMittente(this.getTipoDestinatario());
		bustaHTTPReply.setMittente(this.getDestinatario());
		bustaHTTPReply.setIndirizzoMittente(this.getIndirizzoDestinatario());
		bustaHTTPReply.setIdentificativoPortaMittente(this.getIdentificativoPortaDestinatario());

		bustaHTTPReply.setServizioApplicativoFruitore(this.getServizioApplicativoFruitore()); // lo mantengo, non deve essere invertito

		Date oraRegistrazione = DateManager.getDate();
		bustaHTTPReply.setOraRegistrazione(oraRegistrazione);
		bustaHTTPReply.setTipoOraRegistrazione(tipoOraRegistrazione,tipoTempo);
		return bustaHTTPReply;
	}

	/**
	 * Data una busta, ne ritorna una copia
	 *
	 * @return una busta
	 * 
	 */
	public Busta newInstance(){
		
		// Non uso il base clone per far si che venga usato il costruttore new String()
		
		Busta clone = null;
		if(this.getProtocollo()!=null){
			clone = new Busta(new String(this.getProtocollo()));
		}else{
			String pNull = null;
			clone = new Busta(pNull);
		}

		// id 
		clone.setId(this.getId()!=null ? Long.valueOf(this.getId()+"") : null);
		
		// mittente
		clone.setTipoMittente(this.getTipoMittente()!=null ? new String(this.getTipoMittente()) : null);
		clone.setIndirizzoMittente(this.getIndirizzoMittente()!=null ? new String(this.getIndirizzoMittente()) : null);
		clone.setMittente(this.getMittente()!=null ? new String(this.getMittente()) : null);
		clone.setIdentificativoPortaMittente(this.getIdentificativoPortaMittente()!=null ? new String(this.getIdentificativoPortaMittente()) : null);

		// destinatario
		clone.setTipoDestinatario(this.getTipoDestinatario()!=null ? new String(this.getTipoDestinatario()) : null);
		clone.setIndirizzoDestinatario(this.getIndirizzoDestinatario()!=null ? new String(this.getIndirizzoDestinatario()) : null);
		clone.setDestinatario(this.getDestinatario()!=null ? new String(this.getDestinatario()) : null);
		clone.setIdentificativoPortaDestinatario(this.getIdentificativoPortaDestinatario()!=null ? new String(this.getIdentificativoPortaDestinatario()) : null);
		
		// profilo di collaborazione
		clone.setProfiloDiCollaborazione(this.getProfiloDiCollaborazione());
		clone.setProfiloDiCollaborazioneValue(this.getProfiloDiCollaborazioneValue()!=null ? new String(this.getProfiloDiCollaborazioneValue()) : null);
		clone.setServizioCorrelato(this.getServizioCorrelato()!=null ? new String(this.getServizioCorrelato()) : null);
		clone.setTipoServizioCorrelato(this.getTipoServizioCorrelato()!=null ? new String(this.getTipoServizioCorrelato()) : null);
		
		// collaborazione
		clone.setCollaborazione(this.getCollaborazione()!=null ? new String(this.getCollaborazione()) : null);
		
		// servizio
		clone.setServizio(this.getServizio()!=null ? new String(this.getServizio()) : null);
		clone.setTipoServizio(this.getTipoServizio()!=null ? new String(this.getTipoServizio()) : null);
		if(this.getVersioneServizio()!=null) {
			clone.setVersioneServizio(Integer.valueOf(this.getVersioneServizio()+""));
		}
		
		// servizio [info-richiedente]
		clone.setServizioRichiedenteBustaDiServizio(this.servizioRichiedenteBustaDiServizio!=null ? new String(this.servizioRichiedenteBustaDiServizio) : null);
		clone.setTipoServizioRichiedenteBustaDiServizio(this.tipoServizioRichiedenteBustaDiServizio!=null ? new String(this.tipoServizioRichiedenteBustaDiServizio) : null);
		clone.setVersioneServizioRichiedenteBustaDiServizio(this.versioneServizioRichiedenteBustaDiServizio!=null ? Integer.valueOf(this.versioneServizioRichiedenteBustaDiServizio.intValue()+"") : null);
		
		// azione
		clone.setAzione(this.getAzione()!=null ? new String(this.getAzione()) : null);
		
		// azione [info-richiedente]
		clone.setAzioneRichiedenteBustaDiServizio(this.azioneRichiedenteBustaDiServizio!=null ? new String(this.azioneRichiedenteBustaDiServizio) : null);
		
		// identificativi
		clone.setID(this.getID()!=null ? new String(this.getID()) : null);
		clone.setRiferimentoMessaggio(this.getRiferimentoMessaggio()!=null ? new String(this.getRiferimentoMessaggio()) : null);
		
		// identificativi [info-richiedente]
		clone.setRiferimentoMsgBustaRichiedenteServizio(this.riferimentoMsgBustaRichiedenteServizio!=null ? new String(this.riferimentoMsgBustaRichiedenteServizio) : null);
		
		// date
		clone.setOraRegistrazione(this.getOraRegistrazione()!=null ? new Date(this.getOraRegistrazione().getTime()) : null);
		clone.setTipoOraRegistrazione(this.getTipoOraRegistrazione(),
				this.getTipoOraRegistrazioneValue()!=null ? new String(this.getTipoOraRegistrazioneValue()) : null);
		clone.setTipoOraRegistrazioneValue(this.getTipoOraRegistrazioneValue()!=null ? new String(this.getTipoOraRegistrazioneValue()) : null);
		clone.setScadenza(this.getScadenza()!=null ? new Date(this.getScadenza().getTime()) : null);

		// profilo di trasmissione
		clone.setInoltro(this.getInoltro(),
				this.getInoltroValue()!=null ? new String(this.getInoltroValue()) : null);
		clone.setInoltroValue(this.getInoltroValue()!=null ? new String(this.getInoltroValue()) : null);
		clone.setConfermaRicezione(Boolean.valueOf(this.isConfermaRicezione()+""));
		
		// sequenza
		clone.setSequenza(Long.valueOf(this.getSequenza()+""));
		
		// servizi applicativi
		clone.setServizioApplicativoFruitore(this.getServizioApplicativoFruitore()!=null ? new String(this.getServizioApplicativoFruitore()) : null);
		clone.setServizioApplicativoErogatore(this.getServizioApplicativoErogatore()!=null ? new String(this.getServizioApplicativoErogatore()) : null);

		// protocollo
		clone.setProtocollo(this.getProtocollo()!=null ? new String(this.getProtocollo()) : null);

		// digest
		clone.setDigest(this.getDigest()!=null ? new String(this.getDigest()) : null);

		// properties
		String[]propertiesNames = this.getPropertiesNames();
		if(propertiesNames!=null){
			for (int i = 0; i < propertiesNames.length; i++) {
				String key = propertiesNames[i];
				String value = this.getProperty(key);
				if(key!=null && value!=null){
					clone.addProperty(new String(key), new String(value));
				}
			}
		}

		// ListaEccezioni
		for(int i=0; i<this.sizeListaEccezioni(); i++){
			clone.addEccezione(this.getEccezione(i).newInstance());
		}
		
		// ListaRiscontri
		for(int i=0; i<this.sizeListaRiscontri(); i++){
			clone.addRiscontro(this.getRiscontro(i).newInstance());
		}
		
		// ListaTrasmissioni
		for(int i=0; i<this.sizeListaTrasmissioni(); i++){
			clone.addTrasmissione(this.getTrasmissione(i).newInstance());
		}



		return clone;
	}

}