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.web.ctrlstat.driver;

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

import org.openspcoop2.core.allarmi.Allarme;
import org.openspcoop2.core.allarmi.AllarmeHistory;
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.GenericProperties;
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.SystemProperties;
import org.openspcoop2.core.config.constants.CostantiConfigurazione;
import org.openspcoop2.core.config.driver.DriverConfigurazioneException;
import org.openspcoop2.core.config.utils.UpdateProprietaOggetto;
import org.openspcoop2.core.controllo_traffico.AttivazionePolicy;
import org.openspcoop2.core.controllo_traffico.ConfigurazioneGenerale;
import org.openspcoop2.core.controllo_traffico.ConfigurazionePolicy;
import org.openspcoop2.core.id.IDAccordo;
import org.openspcoop2.core.id.IDAccordoCooperazione;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.mapping.MappingErogazionePortaApplicativa;
import org.openspcoop2.core.mapping.MappingFruizionePortaDelegata;
import org.openspcoop2.core.registry.AccordoCooperazione;
import org.openspcoop2.core.registry.AccordoServizioParteComune;
import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
import org.openspcoop2.core.registry.Documento;
import org.openspcoop2.core.registry.Gruppo;
import org.openspcoop2.core.registry.PortType;
import org.openspcoop2.core.registry.PortaDominio;
import org.openspcoop2.core.registry.Ruolo;
import org.openspcoop2.core.registry.Scope;
import org.openspcoop2.core.registry.Soggetto;
import org.openspcoop2.core.registry.driver.IDAccordoCooperazioneFactory;
import org.openspcoop2.core.registry.driver.IDAccordoFactory;
import org.openspcoop2.core.registry.driver.IDServizioFactory;
import org.openspcoop2.monitor.engine.alarm.wrapper.ConfigurazioneAllarmeBean;
import org.openspcoop2.core.plugins.Plugin;
import org.openspcoop2.pdd.core.keystore.RemoteStoreKeyEntry;
import org.openspcoop2.pdd.monitor.driver.FilterSearch;
import org.openspcoop2.utils.serialization.IOException;
import org.openspcoop2.web.ctrlstat.dao.PdDControlStation;
import org.openspcoop2.web.ctrlstat.dao.SoggettoCtrlStat;
import org.openspcoop2.web.ctrlstat.plugins.IExtendedBean;
import org.openspcoop2.web.lib.audit.dao.Filtro;
import org.openspcoop2.web.lib.audit.log.Operation;
import org.openspcoop2.web.lib.users.dao.User;



/**
 * Classe utilizzata per generare gli identificatori degli oggetti presenti nella govwayConsole.
 *
 * 
 * @author Andrea Poli (apoli@link.it)
 * @author Stefano Corallo (corallo@link.it)
 * @author Sandra Giangrandi (sandra@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 * 
 */
public class IDBuilder implements org.openspcoop2.utils.serialization.IDBuilder {

	private boolean prefix = false;
	
	private IDAccordoFactory idAccordoFactory = null;
	private IDAccordoCooperazioneFactory idAccordoCooperazioneFactory = null;
	private IDServizioFactory idServizioFactory = null;
	
	public IDBuilder(boolean insertClassNamePrefix){
		this.prefix = insertClassNamePrefix; 
		this.idAccordoFactory = IDAccordoFactory.getInstance();
		this.idAccordoCooperazioneFactory = IDAccordoCooperazioneFactory.getInstance();
		this.idServizioFactory = IDServizioFactory.getInstance();
	}
	public IDBuilder(){
		this(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{
		
			
			// ControlStation
			if (o instanceof PdDControlStation) {
				PdDControlStation p = (PdDControlStation) o;
				String id = p.getNome();
				if(this.prefix){
					return "[PdDControlStation] "+ id;
				}else{
					return id;
				}
			}
			else if(o instanceof MappingFruizionePortaDelegata){
				MappingFruizionePortaDelegata mapping = (MappingFruizionePortaDelegata) o;
				StringBuilder bf = new StringBuilder();
				bf.append("FR[");
				bf.append(mapping.getIdFruitore().getTipo()+"/"+mapping.getIdFruitore().getNome());
				bf.append("] SERV[");
				bf.append(mapping.getIdServizio().toString());
				bf.append("] PD["+mapping.getIdPortaDelegata().getNome());
				bf.append("]");
				if(this.prefix){
					return "[MappingFruizionePortaDelegata] "+ bf.toString();
				}else{
					return bf.toString();
				}
			}
			else if(o instanceof MappingErogazionePortaApplicativa){
				MappingErogazionePortaApplicativa mapping = (MappingErogazionePortaApplicativa) o;
				StringBuilder bf = new StringBuilder();
				bf.append("SERV[");
				bf.append(mapping.getIdServizio().toString());
				bf.append("] PA["+mapping.getIdPortaApplicativa().getNome());
				bf.append("]");
				if(this.prefix){
					return "[MappingErogazionePortaApplicativa] "+ bf.toString();
				}else{
					return bf.toString();
				}
			}
			else if (o instanceof SoggettoCtrlStat) {
				SoggettoCtrlStat s = (SoggettoCtrlStat) o;
				String id = s.getTipo()+"/"+s.getNome();
				if(this.prefix){
					return "[SoggettoCtrlStat] "+ id;
				}else{
					return id;
				}
			}
			
			// RegistroServizi
			
			else if(o instanceof org.openspcoop2.core.registry.Soggetto){
				org.openspcoop2.core.registry.Soggetto s = (org.openspcoop2.core.registry.Soggetto) o;
				String id = s.getTipo()+"/"+s.getNome();
				if(this.prefix){
					return "[SoggettoRegistro] "+ id;
				}else{
					return id;
				}
			}
			else if (o instanceof Gruppo) {
				Gruppo g = (Gruppo) o;
				String id = g.getNome();
				if(this.prefix){
					return "[Gruppo] "+ id;
				}else{
					return id;
				}
			}
			else if (o instanceof Ruolo) {
				Ruolo r = (Ruolo) o;
				String id = r.getNome();
				if(this.prefix){
					return "[Ruolo] "+ id;
				}else{
					return id;
				}
			}
			else if (o instanceof Scope) {
				Scope s = (Scope) o;
				String id = s.getNome();
				if(this.prefix){
					return "[Scope] "+ id;
				}else{
					return id;
				}
			}
			else if(o instanceof AccordoCooperazione){
				AccordoCooperazione ac = (AccordoCooperazione) o;
				String id = this.idAccordoCooperazioneFactory.getUriFromAccordo(ac);
				if(this.prefix){
					return "[AccordoCooperazione] "+id;
				}else{
					return id;
				}
			}
			else if(o instanceof AccordoServizioParteComune){
				AccordoServizioParteComune as = (AccordoServizioParteComune) o;
				String id = this.idAccordoFactory.getUriFromAccordo(as);
				if(this.prefix){
					return "[AccordoServizioParteComune] "+ id;
				}else{
					return id;
				}
			}
			else if(o instanceof PortType){
				PortType p = (PortType) o;
				String id = "IDAccordo["+p.getIdAccordo()+"]_"+  p.getNome();
				if(this.prefix){
					return "[PortType] "+ id;
				}else{
					return id;
				}
			}
			else if(o instanceof Documento){
				Documento d = (Documento) o;
				String id = "["+d.getRuolo()+"]["+d.getTipo()+"]"+" "+d.getFile();
				if(this.prefix){
					return "[Documento] "+ id;
				}else{
					return id;
				}
			}else if(o instanceof PortaDominio){
				PortaDominio p = (PortaDominio) o;
				String id = p.getNome();
				if(this.prefix){
					return "[PdD] "+ id;
				}else{
					return id;
				}
			}else if(o instanceof AccordoServizioParteSpecifica){
				AccordoServizioParteSpecifica asps = (AccordoServizioParteSpecifica) o;
				String id = this.idServizioFactory.getUriFromAccordo(asps);
				if(this.prefix){
					return "[AccordoServizioParteSpecifica] "+ id;
				}else{
					return id;
				}
			}else if(o instanceof Soggetto){
				Soggetto s = (Soggetto) o;
				String id = s.getTipo()+"/"+s.getNome();
				if(this.prefix){
					return "[Soggetto] "+ id;
				}else{
					return id;
				}
			}
			
			// Configurazione
			else if(o instanceof org.openspcoop2.core.config.Soggetto){
				org.openspcoop2.core.config.Soggetto s = (org.openspcoop2.core.config.Soggetto) o;
				String id = s.getTipo()+"/"+s.getNome();
				if(this.prefix){
					return "[SoggettoConfigurazione] "+ 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 "[ArchivioPlugins] "+ id;
				}else{
					return id;
				}
			}else if(o instanceof RegistroPluginArchivio){
				RegistroPluginArchivio plugin = (RegistroPluginArchivio) o;
				String id = plugin.getNome();
				if(this.prefix){
					return "[ArchivioPluginsJarEntry] "+ 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");
				}
			}
			
			
			// Users
			else if(o instanceof User){
				User u = (User) o;
				String id = u.getLogin(); 
				if(this.prefix){
					return "[User] "+ id;
				}else{
					return id;
				}
			}
			
			
			// Auditing
			else if(o instanceof org.openspcoop2.web.lib.audit.dao.Configurazione){
				return "Configurazione Auditing";
			}
			
			else if(o instanceof Filtro){
				Filtro f = (Filtro) o;
				String id = f.toString();
				if(this.prefix){
					return "[Filtro] "+ id;
				}else{
					return id;
				}
			}
			
			// Auditing: eliminazione record salvato
			else if(o instanceof org.openspcoop2.web.lib.audit.log.Operation){
				org.openspcoop2.web.lib.audit.log.Operation op = (org.openspcoop2.web.lib.audit.log.Operation) o;
				if(this.prefix){
					return "[OperazioneRegistrataTramiteAuditing] "+ op.getId();
				}else{
					return op.getId()+"";
				}
			}
			
			
			// Monitoraggio Applicativo
			else if(o instanceof FilterSearch){
				FilterSearch f = (FilterSearch) o;
				String id = f.toString();
				if(this.prefix){
					return "[EliminazioneMessaggiTramiteMonitoraggio] "+ id;
				}else{
					return id;
				}
			}
			
			// Configurazione controllo del traffico
			else if(o instanceof ConfigurazioneGenerale) {
				return "ConfigurazioneControlloTraffico";
			}

			// Configurazione Policy
			else if(o instanceof ConfigurazionePolicy) {
				ConfigurazionePolicy policy = (ConfigurazionePolicy) o;
				String id = policy.getIdPolicy();
				if(this.prefix){
					return "[ConfigurazionePolicy] "+ id;
				}else{
					return id;
				}
			}
			
			// Attivazione Policy
			else if(o instanceof AttivazionePolicy) {
				AttivazionePolicy policy = (AttivazionePolicy) o;
				String id = policy.getIdActivePolicy();
				if(this.prefix){
					return "[AttivazionePolicy] "+ id;
				}else{
					return id;
				}
			}
			
			// Generic Properties
			else if(o instanceof GenericProperties) {
				GenericProperties genericProperties = (GenericProperties) o;
				String id = genericProperties.getNome();
				if(this.prefix){
					if(CostantiConfigurazione.GENERIC_PROPERTIES_TOKEN_TIPOLOGIA_VALIDATION.equals(genericProperties.getTipologia())) {
						return "[TokenPolicyValidazione] "+ id;
					}
					else if(CostantiConfigurazione.GENERIC_PROPERTIES_TOKEN_TIPOLOGIA_RETRIEVE.equals(genericProperties.getTipologia())) {
						return "[TokenPolicyNegoziazione] "+ id;
					}
					else {
						return "[GenericProperties] "+ id;
					}
				}else{
					return id;
				}
			}
			
			// Plugins
			else if(o instanceof Plugin) {
				Plugin plugin = (Plugin) o;
				String id = plugin.getTipoPlugin()+"-"+plugin.getTipo();
				if(this.prefix){
					return "[Plugin] "+ id;
				}else{
					return id;
				}
			}
			
			// Allarme
			else if(o instanceof Allarme) {
				Allarme allarme = (Allarme) o;
				String id = allarme.getNome();
				if(this.prefix){
					return "[Allarme] "+ id;
				}else{
					return id;
				}
			}
			
			// Allarme History
			else if(o instanceof AllarmeHistory) {
				AllarmeHistory history = (AllarmeHistory) o;
				String id = history.getIdAllarme().getNome();
				if(this.prefix){
					return "[AllarmeHistory] "+ id;
				}else{
					return id;
				}
			}
			
			// IExtendedBean
			else if(o instanceof IExtendedBean){
				IExtendedBean w = (IExtendedBean) o;
				if(this.prefix){
					return "[ExtendedBean-"+w.getClass().getSimpleName()+"] "+ w.getHumanId();
				}else{
					return w.getHumanId();
				}
			}
			
			// Remote Store Key 
			else if(o instanceof RemoteStoreKeyEntry){
				RemoteStoreKeyEntry entry = (RemoteStoreKeyEntry) o;
				String id = entry.getKid();
				if(this.prefix){
					return "[RemoteStoreKey] "+ id;
				}else{
					return 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 {
		if(o instanceof Documento){
			return this.toID(o);
		}else{
			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{
		
			
			// ControlStation
			if (o instanceof PdDControlStation) {
				PdDControlStation p = (PdDControlStation) o;
				if(p.getOldNomeForUpdate()==null){
					return null; // non lancio un errore
				}
				String id = p.getOldNomeForUpdate();
				if(this.prefix){
					return "[PdDControlStation] "+ id;
				}else{
					return id;
				}
			}
			else if(o instanceof MappingFruizionePortaDelegata){
				return null; // oggetto non modificabile nei dati identificativi
			}
			else if(o instanceof MappingErogazionePortaApplicativa){
				return null; // oggetto non modificabile nei dati identificativi
			}
			else if (o instanceof SoggettoCtrlStat) {
				SoggettoCtrlStat s = (SoggettoCtrlStat) o;
				if(s.getOldTipoForUpdate()==null || s.getOldNomeForUpdate()==null){
					return null; // non lancio un errore
				}
				String id = s.getOldTipoForUpdate()+"/"+s.getOldNomeForUpdate();
				if(this.prefix){
					return "[SoggettoCtrlStat] "+ id;
				}else{
					return id;
				}
			}
			
			// RegistroServizi
			
			else if(o instanceof org.openspcoop2.core.registry.Soggetto){
				org.openspcoop2.core.registry.Soggetto s = (org.openspcoop2.core.registry.Soggetto) o;
				if(s.getOldIDSoggettoForUpdate()==null || s.getOldIDSoggettoForUpdate().getTipo()==null || s.getOldIDSoggettoForUpdate().getNome()==null){
					return null; // non lancio un errore
				}
				String id = s.getOldIDSoggettoForUpdate().getTipo()+"/"+s.getOldIDSoggettoForUpdate().getNome();
				if(this.prefix){
					return "[SoggettoRegistro] "+ id;
				}else{
					return id;
				}
			}
			else if(o instanceof Gruppo){
				Gruppo g = (Gruppo) o;
				if(g.getOldIDGruppoForUpdate()==null){
					return null; // non lancio un errore
				}
				String id = g.getOldIDGruppoForUpdate().getNome();
				if(this.prefix){
					return "[Gruppo] "+ id;
				}else{
					return id;
				}
			}
			else if (o instanceof Ruolo) {
				Ruolo r = (Ruolo) o;
				if(r.getOldIDRuoloForUpdate()==null){
					return null; // non lancio un errore
				}
				String id = r.getOldIDRuoloForUpdate().getNome();
				if(this.prefix){
					return "[Ruolo] "+ id;
				}else{
					return id;
				}
			}
			else if (o instanceof Scope) {
				Scope s = (Scope) o;
				if(s.getOldIDScopeForUpdate()==null){
					return null; // non lancio un errore
				}
				String id = s.getOldIDScopeForUpdate().getNome();
				if(this.prefix){
					return "[Scope] "+ id;
				}else{
					return id;
				}
			}
			else if(o instanceof AccordoCooperazione){
				AccordoCooperazione ac = (AccordoCooperazione) o;
				IDAccordoCooperazione idOLD = ac.getOldIDAccordoForUpdate();
				if(idOLD==null){
					return null; // non lancio un errore
				}
				String id = this.idAccordoCooperazioneFactory.getUriFromIDAccordo(idOLD);
				if(this.prefix){
					return "[AccordoCooperazione] "+id;
				}else{
					return id;
				}
			}
			else if(o instanceof AccordoServizioParteComune){
				AccordoServizioParteComune as = (AccordoServizioParteComune) o;
				IDAccordo idOLD = as.getOldIDAccordoForUpdate();
				if(idOLD==null){
					return null; // non lancio un errore
				}
				String id = this.idAccordoFactory.getUriFromIDAccordo(idOLD);
				if(this.prefix){
					return "[AccordoServizioParteComune] "+ id;
				}else{
					return id;
				}
			}
			else if(o instanceof PortType){
				return null; // oggetto non modificabile nei dati identificativi
			}
			else if(o instanceof Documento){
				return null; // oggetto non modificabile nei dati identificativi
			}else if(o instanceof PortaDominio){
				PortaDominio p = (PortaDominio) o;
				if(p.getOldNomeForUpdate()==null){
					return null; // non lancio un errore
				}
				String id = p.getOldNomeForUpdate();
				if(this.prefix){
					return "[PdD] "+ id;
				}else{
					return id;
				}
			}else if(o instanceof AccordoServizioParteSpecifica){
				AccordoServizioParteSpecifica asps = (AccordoServizioParteSpecifica) o;
				if(asps.getOldIDServizioForUpdate()==null){
					return null; // non lancio un errore
				}	
				String id = this.idServizioFactory.getUriFromIDServizio(asps.getOldIDServizioForUpdate());
				if(this.prefix){
					return "[AccordoServizioParteSpecifica] "+ id;
				}else{
					return id;
				}
			}
			
			// Configurazione
			else if(o instanceof org.openspcoop2.core.config.Soggetto){
				org.openspcoop2.core.config.Soggetto s = (org.openspcoop2.core.config.Soggetto) o;
				if(s.getOldIDSoggettoForUpdate()==null || s.getOldIDSoggettoForUpdate().getTipo()==null || s.getOldIDSoggettoForUpdate().getNome()==null){
					return null; // non lancio un errore
				}
				String id = s.getOldIDSoggettoForUpdate().getTipo()+"/"+s.getOldIDSoggettoForUpdate().getNome();
				if(this.prefix){
					return "[SoggettoConfigurazione] "+ 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 "[ArchivioPlugins] "+ 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
			}
			
			
			// Users
			else if(o instanceof User){
				return null; // oggetto non modificabile nei dati identificativi
			}
			
			
			
			// Auditing
			else if(o instanceof org.openspcoop2.web.lib.audit.dao.Configurazione){
				return null; // oggetto non modificabile nei dati identificativi
			}
			
			else if(o instanceof Filtro){
				return null; // oggetto non modificabile nei dati identificativi
			}
			
			// Auditing: eliminazione record salvato
			else if(o instanceof org.openspcoop2.web.lib.audit.log.Operation){
				return null; // oggetto non modificabile nei dati identificativi
			}
			
			
			// Monitoraggio Applicativo
			else if(o instanceof FilterSearch){
				return null; // oggetto non modificabile nei dati identificativi
			}
			
			// Configurazione controllo del traffico
			else if(o instanceof ConfigurazioneGenerale) {
				return null; // oggetto non modificabile nei dati identificativi
			}
			
			// Configurazione Policy
			else if(o instanceof ConfigurazionePolicy) {
				ConfigurazionePolicy policy = (ConfigurazionePolicy) o;
				if(policy.getOldIdPolicy()==null || policy.getOldIdPolicy().getNome()==null){
					return null; // non lancio un errore
				}
				String id = policy.getOldIdPolicy().getNome();
				if(this.prefix){
					return "[ConfigurazionePolicy] "+ id;
				}else{
					return id;
				}
			}
			
			// Attivazione Policy
			else if(o instanceof AttivazionePolicy) {
				AttivazionePolicy policy = (AttivazionePolicy) o;
				if(policy.getOldIdActivePolicy()==null || policy.getOldIdActivePolicy().getNome()==null){
					return null; // non lancio un errore
				}
				String id = policy.getOldIdActivePolicy().getNome();
				if(this.prefix){
					return "[ConfigurazionePolicy] "+ id;
				}else{
					return id;
				}
			}
			
			// Generic Properties
			else if(o instanceof GenericProperties) {
				return null; // oggetto non modificabile nei dati identificativi
			}
			
			// Plugins
			else if(o instanceof Plugin) {
				Plugin plugin = (Plugin) o;
				if(plugin.getOldIdPlugin()==null || plugin.getOldIdPlugin().getTipoPlugin()==null || plugin.getOldIdPlugin().getTipo()==null){
					return null; // non lancio un errore
				}
				String id = plugin.getOldIdPlugin().getTipoPlugin()+"-"+plugin.getOldIdPlugin().getTipo();
				if(this.prefix){
					return "[Plugin] "+ id;
				}else{
					return id;
				}
			}
			
			// Allarme
			else if(o instanceof Allarme) {
				return null; // oggetto non modificabile nei dati identificativi
			}
			
			// Allarme History
			else if(o instanceof AllarmeHistory) {
				return null; // oggetto non modificabile nei dati identificativi
			}
			
			// IExtendedBean
			else if(o instanceof IExtendedBean){
				IExtendedBean w = (IExtendedBean) o;
				if(w.getOldHumanId()==null){
					return null; // non lancio un errore
				}
				if(this.prefix){
					return "[ExtendedBean-"+w.getClass().getSimpleName()+"] "+ w.getOldHumanId();
				}else{
					return w.getOldHumanId();
				}
			}
			// Remote Store Key
			else if(o instanceof RemoteStoreKeyEntry){
				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){
			
			// ControlStation
			oggetti.add(PortaDominio.class.getSimpleName()); // Al posto di PdDControlStation
			oggetti.add(MappingFruizionePortaDelegata.class.getSimpleName());
			oggetti.add(MappingErogazionePortaApplicativa.class.getSimpleName());
			oggetti.add(Soggetto.class.getSimpleName()); // Al posto di SoggettoControlStation
			
			// RegistroServizi
			oggetti.add(org.openspcoop2.core.registry.Soggetto.class.getSimpleName());
			oggetti.add(Gruppo.class.getSimpleName());
			oggetti.add(Ruolo.class.getSimpleName());
			oggetti.add(Scope.class.getSimpleName());
			oggetti.add(AccordoCooperazione.class.getSimpleName());
			oggetti.add(AccordoServizioParteComune.class.getSimpleName());
			oggetti.add(PortType.class.getSimpleName());
			oggetti.add(Documento.class.getSimpleName());
			oggetti.add(AccordoServizioParteSpecifica.class.getSimpleName());
						
			// Configurazione
			oggetti.add(org.openspcoop2.core.config.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");
			oggetti.add(AccessoRegistro.class.getSimpleName());
			/** non serve come simple name: oggetti.add(AccessoRegistroRegistro.class.getName()); */
			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("RegolaProxyPass");
			oggetti.add("ConfigurazioneUrlInvocazione");
			oggetti.add(UpdateProprietaOggetto.class.getSimpleName());
			
			// Configurazione Controllo Traffico
			oggetti.add("ConfigurazioneControlloTraffico");
			oggetti.add(ConfigurazionePolicy.class.getSimpleName());
			oggetti.add(AttivazionePolicy.class.getSimpleName());
			
			// Generic Properties
			oggetti.add("TokenPolicyValidazione");
			oggetti.add("TokenPolicyNegoziazione");
			oggetti.add(GenericProperties.class.getSimpleName());
			
			// RegistroPlugins
			oggetti.add("ArchivioPlugins");
			oggetti.add("ArchivioPluginsJarEntry");
			
			// Plugin
			oggetti.add(Plugin.class.getSimpleName());
			
			// Allarmi
			oggetti.add(Allarme.class.getSimpleName());
			oggetti.add(AllarmeHistory.class.getSimpleName());
			
			// Username
			oggetti.add(User.class.getSimpleName());
			
			// Auditing
			oggetti.add("ConfigurazioneAuditing");
			oggetti.add("FiltroAuditing");
			oggetti.add("OperazioneRegistrataTramiteAuditing");
			
			// Monitoraggio Applicativo
			oggetti.add("EliminazioneMessaggiTramiteMonitoraggio");
			
			// IExtendedBean
			oggetti.add("ExtendedBean");
			
			// Remote Store Key
			oggetti.add(RemoteStoreKeyEntry.class.getSimpleName());
		}
		else{
		
			// ControlStation
			oggetti.add(PdDControlStation.class.getName());
			oggetti.add(MappingFruizionePortaDelegata.class.getName());
			oggetti.add(MappingErogazionePortaApplicativa.class.getName());
			oggetti.add(SoggettoCtrlStat.class.getName());
			
			// RegistroServizi
			oggetti.add(org.openspcoop2.core.registry.Soggetto.class.getName());
			oggetti.add(Gruppo.class.getName());
			oggetti.add(Ruolo.class.getName());
			oggetti.add(Scope.class.getName());
			oggetti.add(AccordoCooperazione.class.getName());
			oggetti.add(AccordoServizioParteComune.class.getName());
			oggetti.add(PortType.class.getName());
			oggetti.add(Documento.class.getName());
			oggetti.add(AccordoServizioParteSpecifica.class.getName());
			oggetti.add(Soggetto.class.getName());
			
			// Configurazione
			oggetti.add(org.openspcoop2.core.config.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(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(ConfigurazioneUrlInvocazioneRegola.class.getName());
			oggetti.add(ConfigurazioneUrlInvocazione.class.getName());
			oggetti.add(UpdateProprietaOggetto.class.getName());	
			
			// Configurazione Controllo del Traffico
			oggetti.add(ConfigurazioneGenerale.class.getName());
			oggetti.add(ConfigurazionePolicy.class.getName());
			oggetti.add(AttivazionePolicy.class.getName());
			
			// Generic Properties
			oggetti.add(GenericProperties.class.getName());
			
			// RegistroPlugins
			oggetti.add(RegistroPlugin.class.getName());
			oggetti.add(RegistroPluginArchivio.class.getName());

			// Plugin
			oggetti.add(Plugin.class.getName());
			
			// Allarmi
			oggetti.add(Allarme.class.getName());
			oggetti.add(AllarmeHistory.class.getName());
			
			// Username
			oggetti.add(User.class.getName());
			
			// Auditing
			oggetti.add(org.openspcoop2.web.lib.audit.dao.Configurazione.class.getName());
			oggetti.add(Filtro.class.getName());
			oggetti.add(Operation.class.getName());
			
			// Monitoraggio Applicativo
			oggetti.add(FilterSearch.class.getName());
			
			// IExtendedBean
			oggetti.add(IExtendedBean.class.getName());
			
			// Remote Store Key
			oggetti.add(RemoteStoreKeyEntry.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 PdDControlStation){
			return PortaDominio.class.getSimpleName();
		}
		else if(o instanceof SoggettoCtrlStat){
			return Soggetto.class.getSimpleName();
		}
		else if(o instanceof Configurazione){
			return "Configurazione";
		}
		else if(o instanceof AccessoRegistroRegistro){
			return AccessoRegistro.class.getSimpleName();
		}
		else if(o instanceof org.openspcoop2.web.lib.audit.dao.Configurazione){
			return "ConfigurazioneAuditing";
		}
		else if(o instanceof Filtro){
			return "FiltroAuditing";
		}
		else if(o instanceof Operation){
			return "OperazioneRegistrataTramiteAuditing";
		}
		else if(o instanceof FilterSearch){
			return "EliminazioneMessaggiTramiteMonitoraggio";
		}
		else if(o instanceof ConfigurazioneGenerale){
			return "ConfigurazioneControlloTraffico";
		}
		else if(o instanceof IExtendedBean){
			return "ExtendedBean-"+o.getClass().getSimpleName();
		}
		else if(o instanceof ConfigurazioneAllarmeBean){
			return Allarme.class.getSimpleName();
		}
		else if(o instanceof ConfigurazioneUrlInvocazioneRegola) {
			return "RegolaProxyPass";
		}
		else if(o instanceof ConfigurazioneUrlInvocazione) {
			return "ConfigurazioneUrlInvocazione";
		}
		else if(o instanceof GenericProperties) {
			return getSimpleNameGenericProperties(o);
		}
		else if(o instanceof RegistroPlugin) {
			return "ArchivioPlugins";
		}
		else if(o instanceof RegistroPluginArchivio) {
			return "ArchivioPluginsJarEntry";
		}
		else if(o instanceof RemoteStoreKeyEntry) {
			return "RemoteStoreKey";
		}
		else{
			return o.getClass().getSimpleName();
		}
		
	}
	
	private String getSimpleNameGenericProperties(Object o) throws IOException{
		GenericProperties  genericProperties = (GenericProperties) o;
		if(CostantiConfigurazione.GENERIC_PROPERTIES_TOKEN_TIPOLOGIA_VALIDATION.equals(genericProperties.getTipologia())) {
			return "TokenPolicyValidazione";
		}
		else if(CostantiConfigurazione.GENERIC_PROPERTIES_TOKEN_TIPOLOGIA_RETRIEVE.equals(genericProperties.getTipologia())) {
			return "TokenPolicyNegoziazione";
		}
		else {
			return o.getClass().getSimpleName();
		}
	}
}