Eccezione.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 org.apache.commons.lang.NotImplementedException;
import org.openspcoop2.core.tracciamento.CodiceEccezione;
import org.openspcoop2.core.tracciamento.constants.TipoCodificaEccezione;
import org.openspcoop2.core.tracciamento.constants.TipoRilevanzaEccezione;
import org.openspcoop2.message.soap.SOAPFaultCode;
import org.openspcoop2.protocol.sdk.constants.CodiceErroreCooperazione;
import org.openspcoop2.protocol.sdk.constants.ContestoCodificaEccezione;
import org.openspcoop2.protocol.sdk.constants.ErroreCooperazione;
import org.openspcoop2.protocol.sdk.constants.LivelloRilevanza;
import org.openspcoop2.protocol.sdk.constants.SubCodiceErrore;




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

public class Eccezione implements java.io.Serializable{

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = 1L;

	private org.openspcoop2.core.tracciamento.Eccezione eccezione;
	
	private ErroreCooperazione errore;
	
	private SOAPFaultCode soapFaultCode;
	

	
	
	/* Metodi da utilizzare solo nelle implementazioni dei protocolli */
	public Eccezione() {
		this.eccezione = new org.openspcoop2.core.tracciamento.Eccezione();
	}
	
    public Eccezione(String codiceEcc, String descrizione, boolean isErroreValidazione, IProtocolFactory<?> protocolFactory) throws ProtocolException{
		this(new ErroreCooperazione(descrizione,CodiceErroreCooperazione.UNKNOWN), isErroreValidazione, null, protocolFactory); // codice lo imposto subito dopo
		this.setCodiceEccezioneValue(codiceEcc);
		this.setCodiceEccezione(protocolFactory.createTraduttore().toCodiceErroreCooperazione(codiceEcc));
		this.setDescrizione(descrizione); // in modo che non venga tradotto alla chiamata della get
	}
    public Eccezione(CodiceErroreCooperazione codiceEcc, String descrizione, boolean isErroreValidazione, IProtocolFactory<?> protocolFactory) throws ProtocolException{
		this(new ErroreCooperazione(descrizione,codiceEcc), isErroreValidazione, null, protocolFactory);
		this.setDescrizione(descrizione); // in modo che non venga tradotto alla chiamata della get
	}
    
    /* Metodi da utilizzare per fare attuare la traduzione della descrizione */
	public Eccezione(ErroreCooperazione errore,boolean isErroreValidazione, String modulo,IProtocolFactory<?> protocolFactory) throws ProtocolException{
		if(protocolFactory==null) {
			throw new ProtocolException("ProtocolFactory is null");
		}
		this.eccezione = new org.openspcoop2.core.tracciamento.Eccezione();
		if(isErroreValidazione){
			this.setContestoCodifica(ContestoCodificaEccezione.INTESTAZIONE);
			this.setContestoCodificaValue(protocolFactory.createTraduttore().toString(this.getContestoCodifica()));
		}else{
			this.setContestoCodifica(ContestoCodificaEccezione.PROCESSAMENTO);
			this.setContestoCodificaValue(protocolFactory.createTraduttore().toString(this.getContestoCodifica()));
		}
		this.errore = errore;
		this.setCodiceEccezione(this.errore.getCodiceErrore()); // viene tradotto dopo nel metodo get
		//this.setDescrizione(this.errore.getDescrizioneRawValue()); // viene tradotto dopo nel metodo get
		this.setRilevanza(LivelloRilevanza.ERROR);
	}
	
	/* Wrapper */
	public Eccezione(org.openspcoop2.core.tracciamento.Eccezione eccezione){
		this.eccezione = eccezione;
		this.errore = new ErroreCooperazione(this.eccezione.getDescrizione(),this.getCodiceEccezione());
	}

	// base
	
	public org.openspcoop2.core.tracciamento.Eccezione getEccezione() {
		return this.eccezione;
	}
	public void setEccezione(org.openspcoop2.core.tracciamento.Eccezione eccezione) {
		this.eccezione = eccezione;
		this.errore = new ErroreCooperazione(this.eccezione.getDescrizione(),this.getCodiceEccezione());
	}
	
	
	
	// id  [Wrapper]
	
	public Long getId() {
		return this.eccezione.getId();
	}
	public void setId(Long id) {
		this.eccezione.setId(id);
	}
	
	
	
	/* Metodi da utilizzare solo nelle implementazioni dei protocolli */
	public static Eccezione newEccezione(){
		Eccezione ecc = new Eccezione();
		return ecc;
	}
	public static Eccezione getEccezioneValidazione(CodiceErroreCooperazione codiceEcc, String descrizione, IProtocolFactory<?> protocolFactory) throws ProtocolException{
		return new Eccezione(codiceEcc,descrizione, true, protocolFactory);
	}
	public static Eccezione getEccezioneProcessamento(CodiceErroreCooperazione codiceEcc, String descrizione, IProtocolFactory<?> protocolFactory) throws ProtocolException{
		return new Eccezione(codiceEcc,descrizione, false, protocolFactory);
	}
	
	/* Metodi da utilizzare per fare attuare la traduzione della descrizione */
	public static Eccezione getEccezioneValidazione(ErroreCooperazione errore, IProtocolFactory<?> protocolFactory) throws ProtocolException{
		return new Eccezione(errore, true, null, protocolFactory);
	}
	public static Eccezione getEccezioneProcessamento(ErroreCooperazione errore, IProtocolFactory<?> protocolFactory) throws ProtocolException{
		return new Eccezione(errore, false, null, protocolFactory);
	}
	
	
	
	
	
	/* --- CODICE ECCEZIONE [Wrapper] --- */
	
    public CodiceErroreCooperazione getCodiceEccezione() {
    	if(this.eccezione.getCodice()!=null && this.eccezione.getCodice().getTipo()!=null){
    		return CodiceErroreCooperazione.toCodiceErroreCooperazione(this.eccezione.getCodice().getTipo());
    	}
        return null;
    }
    public void setCodiceEccezione(CodiceErroreCooperazione value) {
        if(value!=null){
        	if(this.eccezione.getCodice()==null){
        		this.eccezione.setCodice(new CodiceEccezione());
        	}
        	this.eccezione.getCodice().setTipo(value.getCodice());
        }
        else{
        	if(this.eccezione.getCodice()!=null){
        		if(this.eccezione.getCodice().getBase()==null && this.eccezione.getCodice().getSottotipo()==null){
        			this.eccezione.setCodice(null);
        		}
        		else{
        			this.eccezione.getCodice().setTipo(null);
        		}
        	}
        }
    }
    
    public String getCodiceEccezioneValue(IProtocolFactory<?> protocolFactory) throws ProtocolException {
    	String codiceEccezioneValue = null;
    	if(this.eccezione.getCodice()!=null){
    		codiceEccezioneValue = this.eccezione.getCodice().getBase();
    	}
    	return codiceEccezioneValue == null ? protocolFactory.createTraduttore().toString(this.getCodiceEccezione(),this.getSubCodiceEccezione()) : codiceEccezioneValue;
    }
    public void setCodiceEccezioneValue(String value) {
        if(value!=null){
        	if(this.eccezione.getCodice()==null){
        		this.eccezione.setCodice(new CodiceEccezione());
        	}
        	this.eccezione.getCodice().setBase(value);
        }
        else{
        	if(this.eccezione.getCodice()!=null){
        		if(this.eccezione.getCodice().getTipo()==null && this.eccezione.getCodice().getSottotipo()==null){
        			this.eccezione.setCodice(null);
        		}
        		else{
        			this.eccezione.getCodice().setBase(null);
        		}
        	}
        }
    }
    
	public SubCodiceErrore getSubCodiceEccezione() {
		if(this.eccezione.getCodice()!=null && this.eccezione.getCodice().getSottotipo()!=null){
			SubCodiceErrore sub = new SubCodiceErrore();
			sub.setSubCodice(this.eccezione.getCodice().getSottotipo());
			return sub;
    	}
        return null;
	}
	public void setSubCodiceEccezione(SubCodiceErrore subCodiceEccezione) {
		if(subCodiceEccezione!=null){
        	if(this.eccezione.getCodice()==null){
        		this.eccezione.setCodice(new CodiceEccezione());
        	}
        	this.eccezione.getCodice().setSottotipo(subCodiceEccezione.getSubCodice());
        }
        else{
        	if(this.eccezione.getCodice()!=null){
        		if(this.eccezione.getCodice().getTipo()==null && this.eccezione.getCodice().getBase()==null){
        			this.eccezione.setCodice(null);
        		}
        		else{
        			this.eccezione.getCodice().setSottotipo(null);
        		}
        	}
        }
	}
    
	
	
	
	/* --- DESCRIZIONE ECCEZIONE [Wrapper] --- */
	
	public String getDescrizione(IProtocolFactory<?> protocolFactory) throws ProtocolException {
		String descrizione = this.eccezione.getDescrizione();
        return descrizione == null ? protocolFactory.createTraduttore().toString(this.getErrore()) : descrizione;
    }
    public void setDescrizione(String value) {
       this.eccezione.setDescrizione(value);
    }

    
    
    
    /* --- ERRORE COOPERAZIONE --- */
    
    public ErroreCooperazione getErrore() {
		return this.errore;
	}
    
    
    
    
	/* --- CONTESTO CODIFICA ECCEZIONE --- */

    public ContestoCodificaEccezione getContestoCodifica() {
    	if(this.eccezione.getContestoCodifica()!=null && this.eccezione.getContestoCodifica().getTipo()!=null){
    		switch (this.eccezione.getContestoCodifica().getTipo()) {
			case ECCEZIONE_PROCESSAMENTO:
				return ContestoCodificaEccezione.PROCESSAMENTO;
			case ECCEZIONE_VALIDAZIONE_PROTOCOLLO:
				return ContestoCodificaEccezione.INTESTAZIONE;
			case SCONOSCIUTO:
				return null;
			}
    	}
        return null;
    }
    public void setContestoCodifica(ContestoCodificaEccezione value) {
    	if(value!=null){
        	if(this.eccezione.getContestoCodifica()==null){
        		this.eccezione.setContestoCodifica(new org.openspcoop2.core.tracciamento.ContestoCodificaEccezione());
        	}
        	switch (value) {
			case INTESTAZIONE:
				this.eccezione.getContestoCodifica().setTipo(TipoCodificaEccezione.ECCEZIONE_VALIDAZIONE_PROTOCOLLO);
				break;
			case PROCESSAMENTO:
				this.eccezione.getContestoCodifica().setTipo(TipoCodificaEccezione.ECCEZIONE_PROCESSAMENTO);
				break;
			default:
				this.eccezione.getContestoCodifica().setTipo(TipoCodificaEccezione.SCONOSCIUTO);
				break;
			}
        }
        else{
        	if(this.eccezione.getContestoCodifica()!=null){
        		if(this.eccezione.getContestoCodifica().getBase()==null){
        			this.eccezione.setContestoCodifica(null);
        		}
        		else{
        			this.eccezione.getContestoCodifica().setTipo(null);
        		}
        	}
        }
    }
    
    public String getContestoCodificaValue(IProtocolFactory<?> protocolFactory) throws ProtocolException {
    	String contestoCodificaValue = null;
    	if(this.eccezione.getContestoCodifica()!=null){
    		contestoCodificaValue = this.eccezione.getContestoCodifica().getBase();
    	}
    	return contestoCodificaValue == null ? protocolFactory.createTraduttore().toString(this.getContestoCodifica()) : contestoCodificaValue;
    }
    public void setContestoCodificaValue(String value) {
    	if(value!=null){
        	if(this.eccezione.getContestoCodifica()==null){
        		this.eccezione.setContestoCodifica(new org.openspcoop2.core.tracciamento.ContestoCodificaEccezione());
        	}
        	this.eccezione.getContestoCodifica().setBase(value);
        }
        else{
        	if(this.eccezione.getContestoCodifica()!=null){
        		if(this.eccezione.getContestoCodifica().getTipo()==null){
        			this.eccezione.setContestoCodifica(null);
        		}
        		else{
        			this.eccezione.getContestoCodifica().setBase(null);
        		}
        	}
        }
    }
 
   
    
    
    
    /* --- LIVELLO RILEVANZA ECCEZIONE --- */
    
    public LivelloRilevanza getRilevanza() {
    	if(this.eccezione.getRilevanza()!=null && this.eccezione.getRilevanza().getTipo()!=null){
    		switch (this.eccezione.getRilevanza().getTipo()) {
			case DEBUG:
				return LivelloRilevanza.DEBUG;
			case INFO:
				return LivelloRilevanza.INFO;
			case WARN:
				return LivelloRilevanza.WARN;
			case ERROR:
				return LivelloRilevanza.ERROR;
			case FATAL:
				return LivelloRilevanza.FATAL;
			case SCONOSCIUTO:
				return LivelloRilevanza.UNKNOWN;
			}
    	}
        return null;
    }
    public void setRilevanza(LivelloRilevanza value) {
    	if(value!=null){
        	if(this.eccezione.getRilevanza()==null){
        		this.eccezione.setRilevanza(new org.openspcoop2.core.tracciamento.RilevanzaEccezione());
        	}
        	switch (value) {
			case DEBUG:
				this.eccezione.getRilevanza().setTipo(TipoRilevanzaEccezione.DEBUG);
				break;
			case INFO:
				this.eccezione.getRilevanza().setTipo(TipoRilevanzaEccezione.INFO);
				break;
			case ERROR:
				this.eccezione.getRilevanza().setTipo(TipoRilevanzaEccezione.ERROR);
				break;
			case FATAL:
				this.eccezione.getRilevanza().setTipo(TipoRilevanzaEccezione.FATAL);
				break;
			case WARN:
				this.eccezione.getRilevanza().setTipo(TipoRilevanzaEccezione.WARN);
				break;
			case UNKNOWN:
				this.eccezione.getRilevanza().setTipo(TipoRilevanzaEccezione.SCONOSCIUTO);
				break;
			}
        }
        else{
        	if(this.eccezione.getRilevanza()!=null){
        		if(this.eccezione.getRilevanza().getBase()==null){
        			this.eccezione.setRilevanza(null);
        		}
        		else{
        			this.eccezione.getRilevanza().setTipo(null);
        		}
        	}
        }
    }
    
    public String getRilevanzaValue(IProtocolFactory<?> protocolFactory) throws ProtocolException {
    	String rilevanzaValue = null;
    	if(this.eccezione.getRilevanza()!=null){
    		rilevanzaValue = this.eccezione.getRilevanza().getBase();
    	}
		return rilevanzaValue == null ? protocolFactory.createTraduttore().toString(this.getRilevanza()) : rilevanzaValue;
    }
    public void setRilevanzaValue(String value) {
    	if(value!=null){
        	if(this.eccezione.getRilevanza()==null){
        		this.eccezione.setRilevanza(new org.openspcoop2.core.tracciamento.RilevanzaEccezione());
        	}
        	this.eccezione.getRilevanza().setBase(value);
        }
        else{
        	if(this.eccezione.getRilevanza()!=null){
        		if(this.eccezione.getRilevanza().getTipo()==null){
        			this.eccezione.setRilevanza(null);
        		}
        		else{
        			this.eccezione.getRilevanza().setBase(null);
        		}
        	}
        }
    }



    
    
    /* --- MODULO FUNZIONALE --- */
    
	public String getModulo() {
		return this.eccezione.getModulo();
	}
	public void setModulo(String modulo) {
		this.eccezione.setModulo(modulo);
	}
	
	
	public SOAPFaultCode getSoapFaultCode() {
		return this.soapFaultCode;
	}
	
	public void setSoapFaultCode(SOAPFaultCode soapFaultCode) {
		this.soapFaultCode = soapFaultCode;
	}
	
	
	
	
	
	/* --- TO STRING --- */
	@Override
	public String toString(){
		throw new NotImplementedException("Use with protocolFactory");
	}
	
	public String toString(IProtocolFactory<?> protocolFactory) throws ProtocolException{
		StringBuilder bf = new StringBuilder();
		bf.append("Eccezione");
		
		if(this.getRilevanza()!=null){
			bf.append(" ");	
			bf.append(this.getRilevanzaValue(protocolFactory));
		}
		
		if(this.getCodiceEccezione()!=null){
			bf.append(" con codice [");
			bf.append(this.getCodiceEccezioneValue(protocolFactory));
			bf.append("]");
		}
		
		if(this.getCodiceEccezione()!=null && this.getContestoCodifica()!=null){
			bf.append(" -");
		}
		
		if(this.getContestoCodifica()!=null){
			bf.append(" ");
			bf.append(this.getContestoCodificaValue(protocolFactory));
		}
		
		//if(this.descrizione!=null){
		String descrizioneErrore = this.getDescrizione(protocolFactory);
		if(descrizioneErrore!=null && !"".equals(descrizioneErrore)){
			//bf.append(" , descrizione errore: ");
			bf.append(": ");
			bf.append(descrizioneErrore);
		}
		//}
		
		return bf.toString();
	}

	public Eccezione newInstance(){
		Eccezione clone = new Eccezione();
		
		// id
		clone.setId(this.getId()!=null ? Long.valueOf(this.getId()+"") : null);
		
		clone.setCodiceEccezione(this.getCodiceEccezione());
		clone.setCodiceEccezioneValue(this.eccezione.getCodice()!=null && this.eccezione.getCodice().getBase()!=null ? 
				new String(this.eccezione.getCodice().getBase()) : null );
		clone.setSubCodiceEccezione(this.getSubCodiceEccezione()!=null ? this.getSubCodiceEccezione().newInstance() : null);
		
		clone.setDescrizione(this.eccezione.getDescrizione()!=null ? new String(this.eccezione.getDescrizione()) : null);
		
		clone.errore = (this.errore!=null ? this.errore.clone() : null);
		
		clone.setContestoCodifica(this.getContestoCodifica());
		clone.setContestoCodificaValue(this.eccezione.getContestoCodifica()!=null && this.eccezione.getContestoCodifica().getBase()!=null ? 
				new String(this.eccezione.getContestoCodifica().getBase()) : null);
		
		clone.setRilevanza(this.getRilevanza());
		clone.setRilevanzaValue(this.eccezione.getRilevanza()!=null && this.eccezione.getRilevanza().getBase()!=null ? 
				new String(this.eccezione.getRilevanza().getBase()) : null);
		
		clone.setModulo(this.getModulo()!=null ? new String(this.getModulo()) : null);
		
		clone.setSoapFaultCode(this.soapFaultCode);
		
		return clone;
	}

}