IDBuilder.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.core.config.driver;

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

import org.openspcoop2.core.config.AccessoConfigurazione;
import org.openspcoop2.core.config.AccessoDatiAttributeAuthority;
import org.openspcoop2.core.config.AccessoDatiAutenticazione;
import org.openspcoop2.core.config.AccessoDatiAutorizzazione;
import org.openspcoop2.core.config.AccessoDatiConsegnaApplicativi;
import org.openspcoop2.core.config.AccessoDatiGestioneToken;
import org.openspcoop2.core.config.AccessoDatiKeystore;
import org.openspcoop2.core.config.AccessoDatiRichieste;
import org.openspcoop2.core.config.AccessoRegistro;
import org.openspcoop2.core.config.AccessoRegistroRegistro;
import org.openspcoop2.core.config.Configurazione;
import org.openspcoop2.core.config.ConfigurazioneUrlInvocazione;
import org.openspcoop2.core.config.ConfigurazioneUrlInvocazioneRegola;
import org.openspcoop2.core.config.GestioneErrore;
import org.openspcoop2.core.config.PortaApplicativa;
import org.openspcoop2.core.config.PortaDelegata;
import org.openspcoop2.core.config.RegistroPlugin;
import org.openspcoop2.core.config.RegistroPluginArchivio;
import org.openspcoop2.core.config.RoutingTable;
import org.openspcoop2.core.config.ServizioApplicativo;
import org.openspcoop2.core.config.Soggetto;
import org.openspcoop2.core.config.SystemProperties;
import org.openspcoop2.core.config.utils.UpdateProprietaOggetto;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.utils.serialization.IOException;





/**
 * Classe utilizzata per generare gli identificatori degli oggetti presenti nella configurazione della PdD.
 *
 *
 * @author Poli Andrea (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */

public class IDBuilder implements org.openspcoop2.utils.serialization.IDBuilder {

	protected boolean prefix = false;
	
	public IDBuilder(boolean insertClassNamePrefix){
		this.prefix = insertClassNamePrefix; 
	}
	public IDBuilder(){
		this.prefix = false;
	}
	
	public static IDBuilder getIDBuilder(){
		return new IDBuilder();
	}
	
	@Override
	public String toID(Object o) throws IOException {
		
		if(o==null)
			throw new IOException("Oggetto is null");
		
		try{
		
			if(o instanceof Soggetto){
				Soggetto s = (Soggetto) o;
				String id = s.getTipo()+"/"+s.getNome();
				if(this.prefix){
					return "[Soggetto] "+ id;
				}else{
					return id;
				}
			}else if(o instanceof ServizioApplicativo){
				ServizioApplicativo s = (ServizioApplicativo) o;
				String id = s.getTipoSoggettoProprietario()+"/"+s.getNomeSoggettoProprietario()+"_"+s.getNome();
				if(this.prefix){
					return "[ServizioApplicativo] "+ id;
				}else{
					return id;
				}
			}
			else if(o instanceof PortaDelegata){
				PortaDelegata pd = (PortaDelegata) o;
				String id = pd.getTipoSoggettoProprietario()+"/"+pd.getNomeSoggettoProprietario()+"_"+pd.getNome();
				if(this.prefix){
					return "[PortaDelegata] "+ id;
				}else{
					return id;
				}
			}
			else if(o instanceof PortaApplicativa){
				PortaApplicativa pa = (PortaApplicativa) o;
				String id = pa.getTipoSoggettoProprietario()+"/"+pa.getNomeSoggettoProprietario()+"_"+pa.getNome();
				if(this.prefix){
					return "[PortaApplicativa] "+ id;
				}else{
					return id;
				}
			}else if(o instanceof RoutingTable){
				return "RoutingTable";
			}else if(o instanceof GestioneErrore){
				return "GestioneErrore";
			}else if(o instanceof Configurazione){
				return "Configurazione";
			}else if(o instanceof AccessoRegistro){
				return "ConfigurazioneRegistroServizi";
			}else if(o instanceof AccessoRegistroRegistro){
				AccessoRegistroRegistro registro = (AccessoRegistroRegistro) o;
				String id = registro.getNome();
				if(this.prefix){
					return "[ConfigurazioneRegistroServizi] "+ id;
				}else{
					return id;
				}
			}else if(o instanceof AccessoConfigurazione){
				return "ConfigurazioneAccessoDati";
			}else if(o instanceof AccessoDatiAutenticazione){
				return "ConfigurazioneAccessoDatiAutenticazione";
			}else if(o instanceof AccessoDatiAutorizzazione){
				return "ConfigurazioneAccessoDatiAutorizzazione";
			}else if(o instanceof AccessoDatiGestioneToken){
				return "ConfigurazioneAccessoDatiGestioneToken";
			}else if(o instanceof AccessoDatiAttributeAuthority){
				return "ConfigurazioneAccessoDatiAttributeAuthority";
			}else if(o instanceof AccessoDatiKeystore){
				return "ConfigurazioneAccessoDatiKeystore";
			}else if(o instanceof AccessoDatiConsegnaApplicativi){
				return "ConfigurazioneAccessoDatiConsegnaApplicativi";
			}else if(o instanceof AccessoDatiRichieste){
				return "ConfigurazioneAccessoDatiRichieste";
			}else if(o instanceof SystemProperties){
				return "ProprietàDiSistema";
			}else if(o instanceof RegistroPlugin){
				RegistroPlugin plugin = (RegistroPlugin) o;
				String id = plugin.getNome();
				if(this.prefix){
					return "[RegistroPlugin] "+ id;
				}else{
					return id;
				}
			}else if(o instanceof RegistroPluginArchivio){
				RegistroPluginArchivio plugin = (RegistroPluginArchivio) o;
				String id = plugin.getNome();
				if(this.prefix){
					return "[RegistroPluginArchivio] "+ plugin.getNomePlugin()+"-"+id;
				}else{
					return id;
				}
			}else if(o instanceof ConfigurazioneUrlInvocazioneRegola){
				ConfigurazioneUrlInvocazioneRegola regola = (ConfigurazioneUrlInvocazioneRegola) o;
				String id = regola.getNome();
				if(this.prefix){
					return "[UrlInvocazioneRegola] "+ id;
				}else{
					return id;
				}
			}else if(o instanceof ConfigurazioneUrlInvocazione){ 
				return "Configurazione UrlInvocazione";
			}
			else if(o instanceof UpdateProprietaOggetto) {
				UpdateProprietaOggetto up = (UpdateProprietaOggetto) o;
				if(up.getIdPortaApplicativa()!=null) {
					if(this.prefix){
						return "[UpdateProprietaOggettoPortaApplicativa] "+ up.getIdPortaApplicativa().getNome();
					}else{
						return "PA-"+up.getIdPortaApplicativa().getNome();
					}
				}
				else if(up.getIdPortaDelegata()!=null) {
					if(this.prefix){
						return "[UpdateProprietaOggettoPortaDelegata] "+ up.getIdPortaDelegata().getNome();
					}else{
						return "PD-"+up.getIdPortaDelegata().getNome();
					}
				}
				else if(up.getIdServizioApplicativo()!=null) {
					IDSoggetto idSog = up.getIdServizioApplicativo().getIdSoggettoProprietario();
					String idSA = idSog.getTipo()+"/"+idSog.getNome()+"_"+up.getIdServizioApplicativo().getNome();
					if(this.prefix){
						return "[UpdateProprietaOggettoServizioApplicativo] "+ idSA;
					}else{
						return "SA-"+idSA;
					}
				}
				else {
					throw new IOException("Tipo di Oggetto gestito ["+o.getClass().getName()+"] senza id");
				}
			}
						
		}catch(Exception e){
			throw new IOException("Trasformazione non riuscita: "+e.getMessage(),e);
		}
		
		throw new IOException("Tipo di Oggetto non gestito ["+o.getClass().getName()+"]");
	}

	@Override
	public String toID(Object o, String field) throws IOException {
		return this.toID(o) + "." + field;
	}

	/**
	 * Genera il vecchio identificatore che identificava l'oggetto passato come parametro prima di un update in corso
	 * L'oggetto in corso deve essere valorizzato negli elementi old_XXX
	 * 
	 * @param o Oggetto su cui generare un identificatore univoco
	 * @return identificatore univoco
	 */
	@Override
	public String toOldID(Object o) throws IOException{
		
		if(o==null)
			throw new IOException("Oggetto is null");
		
		try{
		
			if(o instanceof Soggetto){
				Soggetto s = (Soggetto) o;
				if(s.getOldIDSoggettoForUpdate()==null){
					return null; // non lancio un errore
				}
				String id = s.getOldIDSoggettoForUpdate().getTipo()+"/"+s.getOldIDSoggettoForUpdate().getNome();
				if(this.prefix){
					return "[Soggetto] "+ id;
				}else{
					return id;
				}
			}else if(o instanceof ServizioApplicativo){
				ServizioApplicativo s = (ServizioApplicativo) o;
				if( (s.getOldIDServizioApplicativoForUpdate()==null)) {
					return null; // non lancio un errore
				}
				if( (s.getOldIDServizioApplicativoForUpdate().getIdSoggettoProprietario()==null || 
						s.getOldIDServizioApplicativoForUpdate().getIdSoggettoProprietario().getTipo()==null ||
						s.getOldIDServizioApplicativoForUpdate().getIdSoggettoProprietario().getNome()==null) 
						&& s.getOldIDServizioApplicativoForUpdate().getNome()==null) {
					return null; // non lancio un errore
				}
				String id = null;
				if(s.getOldIDServizioApplicativoForUpdate().getIdSoggettoProprietario()!=null && s.getOldIDServizioApplicativoForUpdate().getNome()!=null){
					id = s.getOldIDServizioApplicativoForUpdate().getIdSoggettoProprietario().getTipo()+"/"+
							s.getOldIDServizioApplicativoForUpdate().getIdSoggettoProprietario().getNome()+"_"+
							s.getOldIDServizioApplicativoForUpdate().getNome();
				}
				else if(s.getOldIDServizioApplicativoForUpdate().getNome()!=null){
					id = s.getTipoSoggettoProprietario()+"/"+s.getNomeSoggettoProprietario()+"_"+
							s.getOldIDServizioApplicativoForUpdate().getNome();
				}
				else if(s.getOldIDServizioApplicativoForUpdate().getIdSoggettoProprietario()==null){
					throw new DriverConfigurazioneException("Oggetto in modifica non correttamente valorizzato");
				}
				else{
					id = s.getOldIDServizioApplicativoForUpdate().getIdSoggettoProprietario().getTipo()+"/"+
							s.getOldIDServizioApplicativoForUpdate().getIdSoggettoProprietario().getNome()+"_"+
							"_"+s.getNome();
				}				
				if(this.prefix){
					return "[ServizioApplicativo] "+ id;
				}else{
					return id;
				}
			}
			else if(o instanceof PortaDelegata){
				PortaDelegata pd = (PortaDelegata) o;
				if(pd.getOldIDPortaDelegataForUpdate()==null || pd.getOldIDPortaDelegataForUpdate().getNome()==null){
					return null; // non lancio un errore
				}
				String id = pd.getOldIDPortaDelegataForUpdate().getNome();
				if(this.prefix){
					return "[PortaDelegata] "+ id;
				}else{
					return id;
				}
			}
			else if(o instanceof PortaApplicativa){
				PortaApplicativa pa = (PortaApplicativa) o;
				if(pa.getOldIDPortaApplicativaForUpdate()==null || pa.getOldIDPortaApplicativaForUpdate().getNome()==null){
					return null; // non lancio un errore
				}
				String id = pa.getOldIDPortaApplicativaForUpdate().getNome();
				if(this.prefix){
					return "[PortaApplicativa] "+ id;
				}else{
					return id;
				}
			}else if(o instanceof RoutingTable){
				return null; // oggetto non modificabile nei dati identificativi
			}else if(o instanceof GestioneErrore){
				return null; // oggetto non modificabile nei dati identificativi
			}else if(o instanceof Configurazione){
				return null; // oggetto non modificabile nei dati identificativi
			}else if(o instanceof AccessoRegistro){
				return null; // oggetto non modificabile nei dati identificativi
			}else if(o instanceof AccessoRegistroRegistro){
				return null; // oggetto non modificabile nei dati identificativi
			}else if(o instanceof AccessoConfigurazione){
				return null; // oggetto non modificabile nei dati identificativi
			}else if(o instanceof AccessoDatiAutenticazione){
				return null; // oggetto non modificabile nei dati identificativi
			}else if(o instanceof AccessoDatiAutorizzazione){
				return null; // oggetto non modificabile nei dati identificativi
			}else if(o instanceof AccessoDatiGestioneToken){
				return null; // oggetto non modificabile nei dati identificativi
			}else if(o instanceof AccessoDatiAttributeAuthority){
				return null; // oggetto non modificabile nei dati identificativi
			}else if(o instanceof AccessoDatiKeystore){
				return null; // oggetto non modificabile nei dati identificativi
			}else if(o instanceof AccessoDatiConsegnaApplicativi){
				return null; // oggetto non modificabile nei dati identificativi
			}else if(o instanceof AccessoDatiRichieste){
				return null; // oggetto non modificabile nei dati identificativi
			}else if(o instanceof SystemProperties){
				return null; // oggetto non modificabile nei dati identificativi
			}else if(o instanceof RegistroPlugin){
				RegistroPlugin plugin = (RegistroPlugin) o;
				if(plugin.getOldNome()==null) {
					return null; // non lancio un errore
				}
				String id = plugin.getOldNome();
				if(this.prefix){
					return "[RegistroPlugin] "+ id;
				}else{
					return id;
				}
			}else if(o instanceof RegistroPluginArchivio){
				return null; // oggetto non modificabile nei dati identificativi
			}else if(o instanceof ConfigurazioneUrlInvocazioneRegola){
				ConfigurazioneUrlInvocazioneRegola regola = (ConfigurazioneUrlInvocazioneRegola) o;
				if(regola.getOldNome()==null) {
					return null; // non lancio un errore
				}
				String id = regola.getOldNome();
				if(this.prefix){
					return "[UrlInvocazioneRegola] "+ id;
				}else{
					return id;
				}
			}else if(o instanceof ConfigurazioneUrlInvocazione){ 
				return null; // oggetto non modificabile nei dati identificativi
			}
			else if(o instanceof UpdateProprietaOggetto) {
				return null; // oggetto non modificabile nei dati identificativi
			}
						
		}catch(Exception e){
			throw new IOException("Trasformazione non riuscita: "+e.getMessage(),e);
		}
		
		throw new IOException("Tipo di Oggetto non gestito ["+o.getClass().getName()+"]");
		
	}
	
	
	/**
	 * Ritorna gli oggetti gestiti
	 * 
	 * @return oggetti gestiti
	 * @throws DriverException
	 */
	@Override
	public String[] getManagedObjects(boolean simpleName) throws IOException{
		List<String> oggetti = new ArrayList<>();
		
		if(simpleName){
			oggetti.add(Soggetto.class.getSimpleName());
			oggetti.add(ServizioApplicativo.class.getSimpleName());
			oggetti.add(PortaDelegata.class.getSimpleName());
			oggetti.add(PortaApplicativa.class.getSimpleName());
			oggetti.add(RoutingTable.class.getSimpleName());
			oggetti.add(GestioneErrore.class.getSimpleName());
			oggetti.add(Configurazione.class.getSimpleName());
			oggetti.add(AccessoRegistro.class.getSimpleName());
			/** non serve come simple name: oggetti.add(AccessoRegistroRegistro.class.getSimpleName()); */
			oggetti.add(AccessoConfigurazione.class.getSimpleName());
			oggetti.add(AccessoDatiAutenticazione.class.getSimpleName());
			oggetti.add(AccessoDatiAutorizzazione.class.getSimpleName());
			oggetti.add(AccessoDatiGestioneToken.class.getSimpleName());
			oggetti.add(AccessoDatiAttributeAuthority.class.getSimpleName());
			oggetti.add(AccessoDatiKeystore.class.getSimpleName());
			oggetti.add(AccessoDatiConsegnaApplicativi.class.getSimpleName());
			oggetti.add(AccessoDatiRichieste.class.getSimpleName());
			oggetti.add(SystemProperties.class.getSimpleName());
			oggetti.add(RegistroPlugin.class.getSimpleName());
			oggetti.add(RegistroPluginArchivio.class.getSimpleName());
			oggetti.add(ConfigurazioneUrlInvocazioneRegola.class.getSimpleName());
			oggetti.add(ConfigurazioneUrlInvocazione.class.getSimpleName());
			oggetti.add(UpdateProprietaOggetto.class.getSimpleName());
		}
		else{
			oggetti.add(Soggetto.class.getName());
			oggetti.add(ServizioApplicativo.class.getName());
			oggetti.add(PortaDelegata.class.getName());
			oggetti.add(PortaApplicativa.class.getName());
			oggetti.add(RoutingTable.class.getName());
			oggetti.add(GestioneErrore.class.getName());
			oggetti.add(Configurazione.class.getName());
			oggetti.add(AccessoRegistro.class.getName());
			oggetti.add(AccessoRegistroRegistro.class.getName());
			oggetti.add(AccessoConfigurazione.class.getName());
			oggetti.add(AccessoDatiAutenticazione.class.getName());
			oggetti.add(AccessoDatiAutorizzazione.class.getName());
			oggetti.add(AccessoDatiGestioneToken.class.getName());
			oggetti.add(AccessoDatiAttributeAuthority.class.getName());
			oggetti.add(AccessoDatiKeystore.class.getName());
			oggetti.add(AccessoDatiConsegnaApplicativi.class.getName());
			oggetti.add(AccessoDatiRichieste.class.getName());
			oggetti.add(SystemProperties.class.getName());
			oggetti.add(RegistroPlugin.class.getName());
			oggetti.add(RegistroPluginArchivio.class.getName());	
			oggetti.add(ConfigurazioneUrlInvocazioneRegola.class.getName());	
			oggetti.add(ConfigurazioneUrlInvocazione.class.getName());	
			oggetti.add(UpdateProprietaOggetto.class.getName());	
		}
		
		String[]tmp = new String[1];
		return oggetti.toArray(tmp);
	}
	
	/**
	 * Ritorna un nome descrittivo dell'oggetto.
	 * 
	 * @param o
	 * @return nome descrittivo dell'oggetto.
	 * @throws DriverException
	 */
	@Override
	public String getSimpleName(Object o) throws IOException{
		
		if(o instanceof AccessoRegistroRegistro){
			return AccessoRegistro.class.getSimpleName();
		}
		else{
			return o.getClass().getSimpleName();
		}
		
	}

}