ErroriCooperazione.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.constants;

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

	MITTENTE_SCONOSCIUTO("Il Mittente non risulta registrato nel Registro dei Servizi",
			CodiceErroreCooperazione.MITTENTE_SCONOSCIUTO),
	MITTENTE_NON_VALIDO("Il Mittente presente nella busta non è valido",
			CodiceErroreCooperazione.MITTENTE_NON_VALIDO),
			
	TIPO_MITTENTE_NON_VALIDO("Il Tipo del mittente presente nella busta non è valido",
			CodiceErroreCooperazione.TIPO_MITTENTE_NON_VALIDO),
	
	DESTINATARIO_SCONOSCIUTO("Il Destinatario non risulta registrato nel Registro dei Servizi",
			CodiceErroreCooperazione.DESTINATARIO_SCONOSCIUTO),
	DESTINATARIO_NON_VALIDO("Il Destinatario presente nella busta non è valido",
			CodiceErroreCooperazione.DESTINATARIO_NON_VALIDO),
			
	TIPO_DESTINATARIO_NON_VALIDO("Il Tipo del destinatario presente nella busta non è valido",
			CodiceErroreCooperazione.TIPO_DESTINATARIO_NON_VALIDO),
					
	SERVIZIO_SCONOSCIUTO("Il Servizio non risulta registrato nel Registro dei Servizi",
			CodiceErroreCooperazione.SERVIZIO_SCONOSCIUTO),
	SERVIZIO_NON_VALIDO("Il Servizio presente nella busta non è valido",
			CodiceErroreCooperazione.SERVIZIO_NON_VALIDO),
			
	TIPO_SERVIZIO_NON_VALIDO("Il Tipo del servizio presente nella busta non è valido",
			CodiceErroreCooperazione.TIPO_SERVIZIO_NON_VALIDO),
	
	VERSIONE_SERVIZIO_NON_VALIDO("La versione del servizio presente nella busta non è valido",
			CodiceErroreCooperazione.VERSIONE_SERVIZIO_NON_VALIDO),
	
	AZIONE_NON_VALIDA("L'azione presente nella busta non è valida",
			CodiceErroreCooperazione.AZIONE_NON_VALIDA),		
			
	IDENTIFICATIVO_MESSAGGIO_GIA_PROCESSATO("La busta presenta un identificativo già processato in precedenza",
			CodiceErroreCooperazione.IDENTIFICATIVO_MESSAGGIO_GIA_PROCESSATO),
			
	RIFERIMENTO_MESSAGGIO_NON_PRESENTE("La busta non contiene un RiferimentoMessaggio alla precedente busta a cui è correlata logicamente come richiede il profilo",
			CodiceErroreCooperazione.RIFERIMENTO_MESSAGGIO_NON_PRESENTE),
	RIFERIMENTO_MESSAGGIO_NON_VALIDO("IdentificativoBusta presente nel RiferimentoMessaggio non è valido",
			CodiceErroreCooperazione.RIFERIMENTO_MESSAGGIO_NON_VALIDO),
	
	MESSAGGIO_SCADUTO("Messaggio scaduto",
			CodiceErroreCooperazione.MESSAGGIO_SCADUTO),
	
	PROFILO_COLLABORAZIONE_SCONOSCIUTO("Busta con profilo di collaborazione sconosciuto",
			CodiceErroreCooperazione.PROFILO_COLLABORAZIONE_SCONOSCIUTO),
	PROFILO_COLLABORAZIONE_NON_VALIDO("Busta con profilo di collaborazione non valido rispetto al tipo di cooperazione in corso",
			CodiceErroreCooperazione.PROFILO_COLLABORAZIONE_NON_VALIDO),
			
	COLLABORAZIONE_NON_VALIDA("La collaborazione presente nella busta non è valida",
			CodiceErroreCooperazione.COLLABORAZIONE_NON_VALIDA),
	
	COLLABORAZIONE_SCONOSCIUTA("La collaborazione presente nella busta non appartiene a nessuna sessione valida",
			CodiceErroreCooperazione.COLLABORAZIONE_SCONOSCIUTA),
	
	PROFILO_TRASMISSIONE_CONFERMA_RICEZIONE_NON_PRESENTE("La busta non contiene una richiesta di 'conferma ricezione', nonostante il servizio indicato richieda, tramite la definizione dell'accordo nel registro, una consegna affidabile",
			CodiceErroreCooperazione.PROFILO_TRASMISSIONE_CONFERMA_RICEZIONE_NON_PRESENTE),
		
	CONSEGNA_IN_ORDINE_NON_GESTIBILE("La busta non contiene una richiesta di 'consegna in ordine', nonostante il servizio indicato richieda, tramite la definizione dell'accordo nel registro, un ordinamento",
			CodiceErroreCooperazione.CONSEGNA_IN_ORDINE_NON_GESTIBILE),
	
	CONSEGNA_IN_ORDINE_FUORI_SEQUENZA("Riscontrato numero di sequenza diverso da 1, in una busta capostipite di una sequenza",
			CodiceErroreCooperazione.CONSEGNA_IN_ORDINE_FUORI_SEQUENZA),
	
	CONSEGNA_IN_ORDINE_TIPO_MITTENTE_NON_VALIDO("Il tipo di mittente non rispetta quello atteso nella gestione della collaborazione con consegna in ordine",
			CodiceErroreCooperazione.CONSEGNA_IN_ORDINE_TIPO_MITTENTE_NON_VALIDO),
	
	CONSEGNA_IN_ORDINE_MITTENTE_NON_VALIDO("Il nome del mittente non rispetta quello atteso nella gestione della collaborazione con consegna in ordine",
			CodiceErroreCooperazione.CONSEGNA_IN_ORDINE_MITTENTE_NON_VALIDO),
	
	CONSEGNA_IN_ORDINE_TIPO_DESTINATARIO_NON_VALIDO("Il tipo di destinatario non rispetta quello atteso nella gestione della collaborazione con consegna in ordine",
			CodiceErroreCooperazione.CONSEGNA_IN_ORDINE_TIPO_DESTINATARIO_NON_VALIDO),
	
	CONSEGNA_IN_ORDINE_DESTINATARIO_NON_VALIDO("Il nome del destinatario non rispetta quello atteso nella gestione della collaborazione con consegna in ordine",
			CodiceErroreCooperazione.CONSEGNA_IN_ORDINE_DESTINATARIO_NON_VALIDO),
	
	CONSEGNA_IN_ORDINE_TIPO_SERVIZIO_NON_VALIDO("Il tipo di servizio non rispetta quello atteso nella gestione della collaborazione con consegna in ordine",
			CodiceErroreCooperazione.CONSEGNA_IN_ORDINE_TIPO_SERVIZIO_NON_VALIDO),
	
	CONSEGNA_IN_ORDINE_SERVIZIO_NON_VALIDO("Il nome del servizio non rispetta quello atteso nella gestione della collaborazione con consegna in ordine",
			CodiceErroreCooperazione.CONSEGNA_IN_ORDINE_SERVIZIO_NON_VALIDO),
	
	CONSEGNA_IN_ORDINE_AZIONE_NON_VALIDA("Il nome dell'azione non rispetta quello atteso nella gestione della collaborazione con consegna in ordine",
			CodiceErroreCooperazione.CONSEGNA_IN_ORDINE_AZIONE_NON_VALIDA),
	
	CONSEGNA_IN_ORDINE_COLLABORAZIONE_IN_BUSTA_NON_CAPOSTIPITE_SCONOSCIUTA("Busta non capostipite che richiede funzionalità di consegna in ordine presenta una collaborazione non registrata per le funzioni di consegna in ordine",
			CodiceErroreCooperazione.CONSEGNA_IN_ORDINE_COLLABORAZIONE_IN_BUSTA_NON_CAPOSTIPITE_SCONOSCIUTA),
	
	CONSEGNA_IN_ORDINE_NON_SUPPORTATA("Funzionalità di consegna in ordine non supportata",
			CodiceErroreCooperazione.CONSEGNA_IN_ORDINE_NON_SUPPORTATA),
			
	MESSAGE_SECURITY("E' occorso un errore durante la gestione della Sicurezza sul Messaggio",
			null),
			
	AUTENTICAZIONE_FALLITA_CREDENZIALI_NON_FORNITE(CostantiProtocollo.PREFISSO_AUTENTICAZIONE_FALLITA+CostantiProtocollo.CREDENZIALI_NON_FORNITE,
			CodiceErroreCooperazione.MITTENTE_NON_VALORIZZATO),
	
	AUTENTICAZIONE_FALLITA_CREDENZIALI_FORNITE_NON_CORRETTE(CostantiProtocollo.PREFISSO_AUTENTICAZIONE_FALLITA+CostantiProtocollo.CREDENZIALI_FORNITE_NON_CORRETTE,
			CodiceErroreCooperazione.MITTENTE_SCONOSCIUTO),
	
	AUTORIZZAZIONE_FALLITA("Il Mittente non è autorizzato a fruire del servizio richiesto",
			null),
			
	ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO("E' occorso un errore durante il processamento del messaggio",
			CodiceErroreCooperazione.ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO),
			
	ERRORE_GENERICO_PROTOCOLLO_NON_CORRETTO("E' stato rilevata una violazione per quanto concerne le informazioni richieste del protocollo in gestione",
			CodiceErroreCooperazione.FORMATO_NON_CORRETTO),
	
	TOKEN_NON_PRESENTE("Token non presente",
			CodiceErroreCooperazione.SICUREZZA_TOKEN_NON_PRESENTE),
	
	TOKEN_NON_VALIDO("Token non valido",
			CodiceErroreCooperazione.SICUREZZA_TOKEN_NON_VALIDO),
	
	TOKEN_AUTORIZZAZIONE_FALLITA("La richiesta presenta un token non sufficiente per fruire del servizio richiesto",
			CodiceErroreCooperazione.SICUREZZA_TOKEN_AUTORIZZAZIONE_FALLITA),
	
	TOKEN_PRESENTE_PIU_VOLTE("Token presente più volte",
			CodiceErroreCooperazione.SICUREZZA_TOKEN_PRESENTE_PIU_VOLTE);
	
	private final String descrizione;
	private final CodiceErroreCooperazione codiceErrore;

	ErroriCooperazione(String descrizione,CodiceErroreCooperazione codiceErrore){
		this.descrizione = descrizione;
		this.codiceErrore = codiceErrore;
	}
	
	@Override
	public String toString(){
		return this.newErroreCooperazione().toString();
	}
	
	private ErroreCooperazione newErroreCooperazione(){
		return newErroreCooperazione(this.descrizione, this.codiceErrore);
	}
	private ErroreCooperazione newErroreCooperazione(String descrizioneParam){
		return newErroreCooperazione(descrizioneParam, this.codiceErrore);
	}
	@SuppressWarnings("unused")
	private ErroreCooperazione newErroreCooperazione(CodiceErroreCooperazione codiceParam){
		return newErroreCooperazione(this.descrizione, codiceParam);
	}
	private ErroreCooperazione newErroreCooperazione(String descrizioneParam,CodiceErroreCooperazione codiceParam){
		String newDescrizione = new String(descrizioneParam);
		return new ErroreCooperazione(newDescrizione, codiceParam);
	}
	
	public ErroreCooperazione getErroreCooperazione() {
		return getErroreCooperazione(null);
	}
	public ErroreCooperazione getErroreCooperazione(String descrizione) {
		if(this.equals(MESSAGE_SECURITY) ||
			this.equals(AUTORIZZAZIONE_FALLITA)){
			throw new RuntimeException("Il metodo non può essere utilizzato con il messaggio "+this.name());
		}
		if(descrizione!=null){
			return newErroreCooperazione(descrizione);
		}
		else{
			return newErroreCooperazione();
		}
	}
	
	public ErroreCooperazione getErroreProfiloCollaborazioneSconosciuto(String profiloCollaborazione) {
		if(this.equals(PROFILO_COLLABORAZIONE_SCONOSCIUTO)){
			if(profiloCollaborazione==null){
				return newErroreCooperazione("Busta senza Profilo di Collaborazione");	
			}else{
				return newErroreCooperazione("Busta con profilo di collaborazione non gestito ["+profiloCollaborazione+"]");	
			}	
		}else{
			throw new RuntimeException("Il metodo può essere utilizzato solo con il messaggio "+PROFILO_COLLABORAZIONE_SCONOSCIUTO.name());
		}
	}
	
	public ErroreCooperazione getErroreProfiloCollaborazioneNonValido(String descrizione) {
		if(this.equals(PROFILO_COLLABORAZIONE_NON_VALIDO)){
			return newErroreCooperazione(descrizione);
		}else{
			throw new RuntimeException("Il metodo può essere utilizzato solo con il messaggio "+PROFILO_COLLABORAZIONE_NON_VALIDO.name());
		}
	}
		
	public ErroreCooperazione getErroreMessageSecurity(String descrizione,CodiceErroreCooperazione codiceErrore) {
		if(this.equals(MESSAGE_SECURITY)){
			if(CodiceErroreCooperazione.isEccezioneMessageSecurity(codiceErrore)==false &&
					CodiceErroreCooperazione.isEccezioneSicurezzaAutorizzazione(codiceErrore)==false &&
					CodiceErroreCooperazione.isEccezioneSicurezzaToken(codiceErrore)==false){ //messageSecurity internamente possiede anche un engine di autorizzazione
				throw new RuntimeException("Il metodo può essere utilizzato solo con codici associati alla sicurezza, relativamente ad errori di messageSecurity, token o erroreAutorizzazione, codice fornito: "+codiceErrore);
			}
			return newErroreCooperazione(descrizione, codiceErrore);	
		}else{
			throw new RuntimeException("Il metodo può essere utilizzato solo con il messaggio "+MESSAGE_SECURITY.name());
		}
	}
	
	public ErroreCooperazione getErroreAutorizzazione(String descrizione,CodiceErroreCooperazione codiceErrore) {
		if(this.equals(AUTORIZZAZIONE_FALLITA)){
			if(CodiceErroreCooperazione.isEccezioneSicurezzaAutorizzazione(codiceErrore)==false){
				throw new RuntimeException("Il metodo può essere utilizzato solo con codici associati alla sicurezza, relativamente a fallimenti di autorizzazione, codice fornito: "+codiceErrore);
			}
			return newErroreCooperazione(descrizione, codiceErrore);	
		}else{
			throw new RuntimeException("Il metodo può essere utilizzato solo con il messaggio "+AUTORIZZAZIONE_FALLITA.name());
		}
	}
		
	public ErroreCooperazione getErroreProcessamento(String descrizione) {
		if(this.equals(ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO)){
			return newErroreCooperazione(descrizione);
		}else{
			throw new RuntimeException("Il metodo può essere utilizzato solo con il messaggio "+ERRORE_GENERICO_PROCESSAMENTO_MESSAGGIO.name());
		}
	}
	
	public ErroreCooperazione getErroreGestioneProtocollo(String descrizione) {
		if(this.equals(ERRORE_GENERICO_PROTOCOLLO_NON_CORRETTO)){
			return newErroreCooperazione(descrizione);
		}else{
			throw new RuntimeException("Il metodo può essere utilizzato solo con il messaggio "+ERRORE_GENERICO_PROTOCOLLO_NON_CORRETTO.name());
		}
	}
	
	public ErroreCooperazione getErroreCredenzialiForniteNonCorrette(String errore) {
		if(this.equals(AUTENTICAZIONE_FALLITA_CREDENZIALI_FORNITE_NON_CORRETTE)){
			return newErroreCooperazione(CostantiProtocollo.PREFISSO_AUTENTICAZIONE_FALLITA+CostantiProtocollo.CREDENZIALI_FORNITE_NON_CORRETTE+": "+errore, CodiceErroreCooperazione.MITTENTE_SCONOSCIUTO);
		}else{
			throw new RuntimeException("Il metodo può essere utilizzato solo con il messaggio "+AUTENTICAZIONE_FALLITA_CREDENZIALI_FORNITE_NON_CORRETTE.name());
		}
	}
}