BasicTraduttore.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.basic.config;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.protocol.basic.BasicComponentFactory;
import org.openspcoop2.protocol.basic.Costanti;
import org.openspcoop2.protocol.manifest.OrganizationType;
import org.openspcoop2.protocol.manifest.ServiceType;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.sdk.constants.CodiceErroreCooperazione;
import org.openspcoop2.protocol.sdk.constants.CodiceErroreIntegrazione;
import org.openspcoop2.protocol.sdk.constants.ContestoCodificaEccezione;
import org.openspcoop2.protocol.sdk.constants.ErroreCooperazione;
import org.openspcoop2.protocol.sdk.constants.ErroreIntegrazione;
import org.openspcoop2.protocol.sdk.constants.Inoltro;
import org.openspcoop2.protocol.sdk.constants.LivelloRilevanza;
import org.openspcoop2.protocol.sdk.constants.MessaggiFaultErroreCooperazione;
import org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione;
import org.openspcoop2.protocol.sdk.constants.SubCodiceErrore;
import org.openspcoop2.protocol.sdk.constants.TipoOraRegistrazione;
import org.openspcoop2.utils.date.DateManager;
import org.openspcoop2.utils.date.DateUtils;


/**	
 * BasicTraduttore
 *
 * @author Poli Andrea (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class BasicTraduttore extends BasicComponentFactory implements org.openspcoop2.protocol.sdk.config.ITraduttore {


	public BasicTraduttore(IProtocolFactory<?> factory) throws ProtocolException{
		super(factory);
	}

	
	
	public String getPrefissoEccezioni() {
		return org.openspcoop2.protocol.basic.Costanti.ERRORE_PROTOCOLLO_PREFIX_CODE;
	}

	@Override
	public String toString(CodiceErroreCooperazione cod) {
		return toString(cod, null);
	}
	
	@Override
	public String toString(CodiceErroreCooperazione cod,SubCodiceErrore subCode) {
		if(subCode==null || subCode.getSubCodice()==null)
			return getPrefissoEccezioni() + cod.getCodice();
		else
			return getPrefissoEccezioni() + cod.getCodice() + "_" + subCode.getSubCodice();
	}
	
	@Override
	public CodiceErroreCooperazione toCodiceErroreCooperazione(String codiceCooperazione) {
		if(codiceCooperazione == null) return CodiceErroreCooperazione.UNKNOWN;
		// Elimino il prefisso
		String codiceNum = codiceCooperazione.replace(getPrefissoEccezioni(), "");
		
		try{
			if(codiceNum.contains("_")){
				// e' presente il subCode
				codiceNum = codiceNum.split("_")[0];
			}
			
			//Provo a convertire i 3 caratteri in un codice intero registrato.
			return CodiceErroreCooperazione.toCodiceErroreCooperazione(Integer.parseInt(codiceNum));
		} catch (Exception e){
			return CodiceErroreCooperazione.UNKNOWN;
		}
	}

	@Override
	public String toString(MessaggiFaultErroreCooperazione msg){
		return msg.toString();
	}
	
	@Override
	public String toString(ErroreCooperazione msg){
		return msg.getDescrizioneRawValue();
	}
	
	@Override
	public String toString(CodiceErroreIntegrazione cod,String prefix, boolean isGenericCodeFor5XX) {
    	
		String codiceMappato = cod.getCodice() + "";
    	
    	if(isGenericCodeFor5XX){
    		// devo ritornare un codice generico, elimino ultime due cifre e aggiungo 00
    		if(cod.getCodice() >= 500 && 
    				!cod.equals(CodiceErroreIntegrazione.CODICE_516_CONNETTORE_UTILIZZO_CON_ERRORE) &&
    				!cod.equals(CodiceErroreIntegrazione.CODICE_517_RISPOSTA_RICHIESTA_NON_RITORNATA) &&
    				!cod.equals(CodiceErroreIntegrazione.CODICE_518_RISPOSTA_RICHIESTA_RITORNATA_COME_FAULT) &&
    				!cod.equals(CodiceErroreIntegrazione.CODICE_559_RICEVUTA_RISPOSTA_CON_ERRORE_TRASPORTO)  &&
    				!cod.equals(CodiceErroreIntegrazione.CODICE_550_PD_SERVICE_NOT_ACTIVE)  &&
    				!cod.equals(CodiceErroreIntegrazione.CODICE_551_PA_SERVICE_NOT_ACTIVE)  &&
    				!cod.equals(CodiceErroreIntegrazione.CODICE_552_IM_SERVICE_NOT_ACTIVE) ){
    			codiceMappato = "500";
    		}
    	}
    	
    	return this._toStringCodiceErroreIntegrazione(codiceMappato, prefix, isGenericCodeFor5XX);
		
	}
	
	@Override
	public String toCodiceErroreIntegrazioneAsString(ErroreIntegrazione errore,String prefix, boolean isGenericCodeFor5XX) {
		if(errore.getCodiceCustom()!=null) {
			return this._toStringCodiceErroreIntegrazione(errore.getCodiceCustom(), prefix, isGenericCodeFor5XX);
		}
		else {
			return this.toString(errore.getCodiceErrore(), prefix, isGenericCodeFor5XX);
		}
	}
	
	private String _toStringCodiceErroreIntegrazione(String codiceMappato,String prefix, boolean isGenericCodeFor5XX) {
    	
    	codiceMappato = (prefix == null ? Costanti.ERRORE_INTEGRAZIONE_PREFIX_CODE : prefix) + codiceMappato;
    	
    	return codiceMappato;
		
	}

	@Override
	public CodiceErroreIntegrazione toCodiceErroreIntegrazione(
			String codiceErroreIntegrazione, String prefix) {
		
		try{
			String intValue = codiceErroreIntegrazione.substring(prefix.length());
			return CodiceErroreIntegrazione.toCodiceErroreIntegrazione(Integer.parseInt(intValue));
		}catch(Exception e){
			this.log.error("Conversione in CodiceErroreIntegrazione della stringa["+codiceErroreIntegrazione+"] prefix["+prefix+"] non riuscita: "+e.getMessage(),e);
			return CodiceErroreIntegrazione.UNKNOWN;
		}
		
	}
	
	@Override
	public String toString(ErroreIntegrazione msg) {
		return msg.getDescrizioneRawValue();
	}
	
	@Override
	public String getDate_protocolFormat() {
		return getDate_protocolFormat(null);
	}
	
	@Override
	public String getDate_protocolFormat(Date date) {
		if(date == null) 
			date = DateManager.getDate();
		SimpleDateFormat dateformat = DateUtils.getSimpleDateFormatMs();
		return dateformat.format(date).replace('_','T');
	}

	/**
	 * Restituisce il valore dell'identificativo porta di default per il soggetto.
	 * @param soggetto
	 * @return IdentificativoPortaDefault
	 */
	@Override
	public String getIdentificativoPortaDefault(IDSoggetto soggetto){
		return "domain/"+getIdentificativoPorta_Nome(soggetto);
	}
	protected String getIdentificativoPorta_Nome(IDSoggetto idSoggetto){
		// non standard, utilizzo tipo/nome per avere l'univocita'
		return idSoggetto.toString();
	}

	/**
	 * Restituisce il valore del Codice IPA di Default
	 * @param soggetto
	 * @return IdentificativoCodiceIPADefault
	 * @throws ProtocolException 
	 */
	@Override
	public String getIdentificativoCodiceIPADefault(IDSoggetto soggetto,boolean createURI) throws ProtocolException{
		if(soggetto==null)
			throw new ProtocolException("Identificativo soggetto non fornito");
		StringBuilder bf = new StringBuilder();
		if(createURI){
			bf.append("uri:dn:");
		}
		bf.append("o=");
		bf.append(getIdentificativoCodiceIPA_Nome(soggetto));
		bf.append(",c=it");
		return bf.toString();
	}
	protected String getIdentificativoCodiceIPA_Nome(IDSoggetto idSoggetto){
		// non standard, utilizzo tipo/nome per avere l'univocita'
		return idSoggetto.toString();
	}
	
	@Override
	public String toString(Inoltro inoltro) {
		return inoltro.getEngineValue();
	}

	@Override
	public String toString(ProfiloDiCollaborazione profilo) {
		return profilo.getEngineValue();
	}

	@Override
	public String toString(TipoOraRegistrazione tipo) {
		return tipo.getEngineValue();
	}

	@Override
	public String toString(LivelloRilevanza rilevanza) {
		return rilevanza.getEngineValue();
	}
	
	@Override
	public LivelloRilevanza toLivelloRilevanza(String livelloRilevanza) {
		return LivelloRilevanza.toLivelloRilevanza(livelloRilevanza);
	}

	@Override
	public Inoltro toInoltro(String inoltro) {
		return Inoltro.toInoltro(inoltro);
	}

	@Override
	public TipoOraRegistrazione toTipoOraRegistrazione(
			String tipoOraRegistrazione) {
		return TipoOraRegistrazione.toTipoOraRegistrazione(tipoOraRegistrazione);
	}

	@Override
	public ProfiloDiCollaborazione toProfiloDiCollaborazione(
			String profiloDiCollaborazione) {
		return ProfiloDiCollaborazione.toProfiloDiCollaborazione(profiloDiCollaborazione);
	}

	@Override
	public String toString(ContestoCodificaEccezione contesto) {
		return contesto.getEngineValue();
	}

	@Override
	public ContestoCodificaEccezione toContestoCodificaEccezione(
			String contestoCodificaEccezione) {
		return ContestoCodificaEccezione.toContestoCodificaEccezione(contestoCodificaEccezione);
	}

	
	@Override
	public String toProtocolOrganizationType(String type) throws ProtocolException{
		for (OrganizationType organization : this.getProtocolFactory().getManifest().getRegistry().getOrganization().getTypes().getTypeList()) {
			if(organization.getName().equals(type)) {
				return organization.getProtocol()!=null ? organization.getProtocol() : organization.getName();
			}
		}
		throw new ProtocolException("Organization Type '"+type+"' not found");
	}
	
	@Override
	public String toProtocolServiceType(String type) throws ProtocolException{
		for (ServiceType service : this.getProtocolFactory().getManifest().getRegistry().getService().getTypes().getTypeList()) {
			if(service.getName().equals(type)) {
				return service.getProtocol()!=null ? service.getProtocol() : service.getName();
			}
		}
		throw new ProtocolException("Service Type '"+type+"' not found");
	}
	
	@Override
	public String toRegistryOrganizationType(String type) throws ProtocolException{
		for (OrganizationType organization : this.getProtocolFactory().getManifest().getRegistry().getOrganization().getTypes().getTypeList()) {
			if(organization.getProtocol()==null) {
				if(organization.getName().equals(type)) {
					return organization.getName();
				}
			}
			else {
				if(organization.getProtocol().equals(type)) {
					return organization.getName();
				}
			}
		}
		throw new ProtocolException("Protocol Organization Type '"+type+"' not found");
	}
	
	@Override
	public String toRegistryServiceType(String type) throws ProtocolException{
		for (ServiceType service : this.getProtocolFactory().getManifest().getRegistry().getService().getTypes().getTypeList()) {
			if(service.getProtocol()==null) {
				if(service.getName().equals(type)) {
					return service.getName();
				}
			}
			else {
				if(service.getProtocol().equals(type)) {
					return service.getName();
				}
			}
		}
		throw new ProtocolException("Protocol Service Type '"+type+"' not found");
	}

}