ExporterUtils.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.servlet.archivi;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.openspcoop2.core.allarmi.Allarme;
import org.openspcoop2.core.allarmi.IdAllarme;
import org.openspcoop2.core.config.CanaleConfigurazione;
import org.openspcoop2.core.config.ConfigurazioneUrlInvocazione;
import org.openspcoop2.core.config.ConfigurazioneUrlInvocazioneRegola;
import org.openspcoop2.core.config.GenericProperties;
import org.openspcoop2.core.config.PortaApplicativa;
import org.openspcoop2.core.config.PortaApplicativaAutorizzazioneServizioApplicativo;
import org.openspcoop2.core.config.PortaApplicativaAutorizzazioneSoggetto;
import org.openspcoop2.core.config.ServizioApplicativo;
import org.openspcoop2.core.config.driver.DriverConfigurazioneException;
import org.openspcoop2.core.config.driver.DriverConfigurazioneNotFound;
import org.openspcoop2.core.controllo_traffico.AttivazionePolicy;
import org.openspcoop2.core.controllo_traffico.ConfigurazionePolicy;
import org.openspcoop2.core.controllo_traffico.IdActivePolicy;
import org.openspcoop2.core.controllo_traffico.IdPolicy;
import org.openspcoop2.core.id.IDAccordo;
import org.openspcoop2.core.id.IDAccordoCooperazione;
import org.openspcoop2.core.id.IDFruizione;
import org.openspcoop2.core.id.IDGenericProperties;
import org.openspcoop2.core.id.IDGruppo;
import org.openspcoop2.core.id.IDPortType;
import org.openspcoop2.core.id.IDPortTypeAzione;
import org.openspcoop2.core.id.IDResource;
import org.openspcoop2.core.id.IDRuolo;
import org.openspcoop2.core.id.IDScope;
import org.openspcoop2.core.id.IDServizio;
import org.openspcoop2.core.id.IDServizioApplicativo;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.plugins.IdPlugin;
import org.openspcoop2.core.plugins.Plugin;
import org.openspcoop2.core.registry.AccordoServizioParteComune;
import org.openspcoop2.core.registry.AccordoServizioParteComuneServizioCompostoServizioComponente;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziException;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziNotFound;
import org.openspcoop2.core.registry.driver.IDAccordoCooperazioneFactory;
import org.openspcoop2.core.registry.driver.IDAccordoFactory;
import org.openspcoop2.core.registry.driver.IDServizioFactory;
import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.sdk.archive.Archive;
import org.openspcoop2.protocol.sdk.archive.ArchiveAccordoCooperazione;
import org.openspcoop2.protocol.sdk.archive.ArchiveAccordoServizioComposto;
import org.openspcoop2.protocol.sdk.archive.ArchiveAccordoServizioParteComune;
import org.openspcoop2.protocol.sdk.archive.ArchiveAccordoServizioParteSpecifica;
import org.openspcoop2.protocol.sdk.archive.ArchiveActivePolicy;
import org.openspcoop2.protocol.sdk.archive.ArchiveAllarme;
import org.openspcoop2.protocol.sdk.archive.ArchiveFruitore;
import org.openspcoop2.protocol.sdk.archive.ArchivePortaApplicativa;
import org.openspcoop2.protocol.sdk.archive.ArchivePortaDelegata;
import org.openspcoop2.protocol.sdk.archive.ArchiveServizioApplicativo;
import org.openspcoop2.protocol.sdk.archive.ArchiveSoggetto;
import org.openspcoop2.protocol.sdk.archive.ExportMode;
import org.openspcoop2.protocol.sdk.archive.IArchive;
import org.openspcoop2.protocol.sdk.constants.ArchiveType;
import org.openspcoop2.web.ctrlstat.core.ControlStationCore;
import org.openspcoop2.web.ctrlstat.core.Utilities;
import org.openspcoop2.web.ctrlstat.driver.DriverControlStationException;
import org.openspcoop2.web.ctrlstat.driver.DriverControlStationNotFound;
import org.openspcoop2.web.ctrlstat.servlet.ac.AccordiCooperazioneCore;
import org.openspcoop2.web.ctrlstat.servlet.apc.AccordiServizioParteComuneCore;
import org.openspcoop2.web.ctrlstat.servlet.aps.AccordiServizioParteSpecificaCore;
import org.openspcoop2.web.ctrlstat.servlet.config.ConfigurazioneCore;
import org.openspcoop2.web.ctrlstat.servlet.ruoli.RuoliCore;
import org.openspcoop2.web.ctrlstat.servlet.sa.ServiziApplicativiCore;
import org.openspcoop2.web.ctrlstat.servlet.scope.ScopeCore;
import org.openspcoop2.web.ctrlstat.servlet.soggetti.SoggettiCore;

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

	private ArchiviCore archiviCore;
	private SoggettiCore soggettiCore;
	private AccordiServizioParteComuneCore aspcCore;
	@SuppressWarnings("unused")
	private AccordiServizioParteSpecificaCore aspsCore;
	private AccordiCooperazioneCore acCore;
	private ServiziApplicativiCore saCore;
	@SuppressWarnings("unused")
	private RuoliCore ruoliCore;
	@SuppressWarnings("unused")
	private ScopeCore scopeCore;
	private ConfigurazioneCore confCore;
	
	private static final String FORMATO_DIVERSO_ATTESO = "Formato diverso da quello atteso";
	
	public ExporterUtils(ArchiviCore archiviCore) throws Exception{
		this.archiviCore = archiviCore;
		this.soggettiCore = new SoggettiCore(archiviCore);
		this.aspcCore = new AccordiServizioParteComuneCore(archiviCore);
		this.aspsCore = new AccordiServizioParteSpecificaCore(archiviCore);
		this.acCore = new AccordiCooperazioneCore(archiviCore);
		this.saCore = new ServiziApplicativiCore(archiviCore);
		this.ruoliCore = new RuoliCore(archiviCore);
		this.scopeCore = new ScopeCore(archiviCore);
		this.confCore = new ConfigurazioneCore(archiviCore);
	}

	public List<ExportMode> getExportModesCompatibleWithAllProtocol(List<String> protocolli,ArchiveType archiveType) throws ProtocolException{
		
		List<ExportMode> exportModes = new ArrayList<>();
		
		for (int i = 0; i < protocolli.size(); i++) {
			String protocolName = protocolli.get(i);
			IProtocolFactory<?> pf = ProtocolFactoryManager.getInstance().getProtocolFactoryByName(protocolName);
			IArchive archiveEngine = pf.createArchive();
			List<ExportMode> exportModesByProtocol = archiveEngine.getExportModes(archiveType);
			for (ExportMode exportMode : exportModesByProtocol) {
				
				boolean found = true;
				
				for (int j = 0; j < protocolli.size(); j++) {
					if(j==i)
						continue;
					String protocolCheck = protocolli.get(j);
					IProtocolFactory<?> pfCheck = ProtocolFactoryManager.getInstance().getProtocolFactoryByName(protocolCheck);
					IArchive archiveEngineCheck = pfCheck.createArchive();
					List<ExportMode> exportModesByProtocolCheck = archiveEngineCheck.getExportModes(archiveType);
					if(!exportModesByProtocolCheck.contains(exportMode)){
						found = false;
						break;
					}
				}
				
				if(found &&
					!exportModes.contains(exportMode)) {
					exportModes.add(exportMode);
				}
				
			}
		}
		
		return exportModes;
	}
	
	public Map<ExportMode,String> getExportModesWithProtocol(List<String> protocolli,ArchiveType archiveType) throws ProtocolException{

		Map<ExportMode,String> exportModes = new HashMap<>();
		for (int i = 0; i < protocolli.size(); i++) {
			String protocolName = protocolli.get(i);
			if(!ArchiviCostanti.PARAMETRO_ARCHIVI_PROTOCOLLO_UNDEFINDED.equals(protocolName)){
				IProtocolFactory<?> pf = ProtocolFactoryManager.getInstance().getProtocolFactoryByName(protocolName);
				IArchive archiveEngine = pf.createArchive();
				List<ExportMode> exportModesByProtocol = archiveEngine.getExportModes(archiveType);
				for (ExportMode exp : exportModesByProtocol) {
					if(!exportModes.containsKey(exp)){
						exportModes.put(exp,protocolName);
					}
				}
			}
		}

		return exportModes;
	}

	
	public boolean existsAtLeastOneExportMode(ArchiveType archiveType, HttpServletRequest request, HttpSession session) throws ProtocolException, DriverRegistroServiziException{
		List<String> protocolli = this.archiviCore.getProtocolli(request, session);
		return this.getExportModesWithProtocol(protocolli, archiveType).size()>0;
	}

	public List<IDSoggetto> getIdsSoggetti(String ids) throws DriverRegistroServiziNotFound, DriverRegistroServiziException{
		List<IDSoggetto> idsSoggetti = new ArrayList<>();
		ArrayList<String> idsToExport = Utilities.parseIdsToRemove(ids);
		for (String id : idsToExport) {
			long idLong = Long.parseLong(id);
			idsSoggetti.add(this.soggettiCore.getIdSoggettoRegistro(idLong));
		}
		return idsSoggetti;
	}
	
	public List<IDServizioApplicativo> getIdsServiziApplicativi(String ids) throws DriverConfigurazioneNotFound, DriverConfigurazioneException{
		List<IDServizioApplicativo> idsSA = new ArrayList<>();
		ArrayList<String> idsToExport = Utilities.parseIdsToRemove(ids);
		for (String id : idsToExport) {
			long idLong = Long.parseLong(id);
			ServizioApplicativo sa = this.saCore.getServizioApplicativo(idLong);
			IDServizioApplicativo idSA = new IDServizioApplicativo();
			idSA.setIdSoggettoProprietario(new IDSoggetto(sa.getTipoSoggettoProprietario(), sa.getNomeSoggettoProprietario()));
			idSA.setNome(sa.getNome());
			idsSA.add(idSA);
		}
		return idsSA;
	}
	
	public List<IDAccordo> getIdsAccordiServizioComposti(String ids) throws DriverRegistroServiziNotFound, DriverRegistroServiziException{
		return this.getIdsAccordiServizioParteComune(ids);
	}
	public List<IDAccordo> getIdsAccordiServizioParteComune(String ids) throws DriverRegistroServiziNotFound, DriverRegistroServiziException{
		List<IDAccordo> idsAccordi = new ArrayList<>();
		ArrayList<String> idsToExport = Utilities.parseIdsToRemove(ids);
		for (String id : idsToExport) {
			long idLong = Long.parseLong(id);
			idsAccordi.add(this.aspcCore.getIdAccordoServizio(idLong));
		}
		return idsAccordi;
	}
	
	public List<IDResource> getIdsAccordiServizioParteComuneRisorsa(String ids) throws DriverRegistroServiziException{
		List<IDResource> idsAccordi = new ArrayList<>();
		ArrayList<String> idsToExport = Utilities.parseIdsToRemove(ids);
		for (String id : idsToExport) {
			if(!id.contains("@")) {
				throw new DriverRegistroServiziException(FORMATO_DIVERSO_ATTESO);
			}
			String [] tmp = id.split("@");
			if(tmp==null || tmp.length!=2) {
				throw new DriverRegistroServiziException(FORMATO_DIVERSO_ATTESO);
			}
			IDResource idR = new IDResource();
			idR.setNome(tmp[0]);
			idR.setIdAccordo(IDAccordoFactory.getInstance().getIDAccordoFromUri(tmp[1]));
			idsAccordi.add(idR);
		}
		return idsAccordi;
	}
	
	public List<IDPortType> getIdsAccordiServizioParteComunePortType(String ids) throws DriverRegistroServiziException{
		List<IDPortType> idsAccordi = new ArrayList<>();
		ArrayList<String> idsToExport = Utilities.parseIdsToRemove(ids);
		for (String id : idsToExport) {
			if(!id.contains("@")) {
				throw new DriverRegistroServiziException(FORMATO_DIVERSO_ATTESO);
			}
			String [] tmp = id.split("@");
			if(tmp==null || tmp.length!=2) {
				throw new DriverRegistroServiziException(FORMATO_DIVERSO_ATTESO);
			}
			IDPortType idPT = new IDPortType();
			idPT.setNome(tmp[0]);
			idPT.setIdAccordo(IDAccordoFactory.getInstance().getIDAccordoFromUri(tmp[1]));
			idsAccordi.add(idPT);
		}
		return idsAccordi;
	}
	
	public List<IDPortTypeAzione> getIdsAccordiServizioParteComuneOperazione(String ids) throws DriverRegistroServiziException{
		List<IDPortTypeAzione> idsAccordi = new ArrayList<>();
		ArrayList<String> idsToExport = Utilities.parseIdsToRemove(ids);
		for (String id : idsToExport) {
			if(!id.contains("@")) {
				throw new DriverRegistroServiziException(FORMATO_DIVERSO_ATTESO);
			}
			String [] tmp = id.split("@");
			if(tmp==null || tmp.length!=3) {
				throw new DriverRegistroServiziException(FORMATO_DIVERSO_ATTESO);
			}
			IDPortTypeAzione idOperazione = new IDPortTypeAzione();
			idOperazione.setNome(tmp[0]);
			IDPortType idPT = new IDPortType();
			idPT.setNome(tmp[1]);
			idPT.setIdAccordo(IDAccordoFactory.getInstance().getIDAccordoFromUri(tmp[2]));
			idOperazione.setIdPortType(idPT);
			idsAccordi.add(idOperazione);
		}
		return idsAccordi;
	}
	
	public List<?> getIdsAccordiServizioParteSpecifica(String ids, boolean isFruizione) throws DriverRegistroServiziException{
		List<IDServizio> idsAccordi = new ArrayList<>();
		List<IDFruizione> fruizioni = new ArrayList<>();
		ArrayList<String> idsToExport = Utilities.parseIdsToRemove(ids);
		for (String id : idsToExport) {
			try {
				if(isFruizione) {
					if(!id.contains("@")) {
						throw new DriverRegistroServiziException("atteso @");
					}
					String idServ = id.split("@")[0];
					IDServizio idS = IDServizioFactory.getInstance().getIDServizioFromUri(idServ);
					String idFruitore = id.split("@")[1];
					IDSoggetto fruitore = new IDSoggetto(idFruitore.split("/")[0], idFruitore.split("/")[1]);
					IDFruizione idFruizione = new IDFruizione();
					idFruizione.setIdFruitore(fruitore);
					idFruizione.setIdServizio(idS);
					fruizioni.add(idFruizione);
				}
				else {
					if(id.contains("@")) {
						// fruizioni
						id = id.split("@")[0];
					}
					IDServizio idS = IDServizioFactory.getInstance().getIDServizioFromUri(id);
					idsAccordi.add(idS);
				}
			}catch (Exception e) {
				throw new DriverRegistroServiziException("Formato id '"+id+"' non valido: "+e.getMessage(),e);
			}
		}
		if(isFruizione) {
			return fruizioni;
		}
		else {
			return idsAccordi;
		}
	}
	
	public List<IDAccordoCooperazione> getIdsAccordiCooperazione(String ids) throws DriverRegistroServiziNotFound, DriverRegistroServiziException{
		List<IDAccordoCooperazione> idsAccordi = new ArrayList<>();
		ArrayList<String> idsToExport = Utilities.parseIdsToRemove(ids);
		for (String id : idsToExport) {
			long idLong = Long.parseLong(id);
			idsAccordi.add(this.acCore.getIdAccordoCooperazione(idLong));
		}
		return idsAccordi;
	}
	
	public List<IDGruppo> getIdsGruppi(String ids) {
		List<IDGruppo> idsGruppi = new ArrayList<>();
		ArrayList<String> idsToExport = Utilities.parseIdsToRemove(ids);
		for (String id : idsToExport) {
			IDGruppo idGruppo = new IDGruppo(id);
			idsGruppi.add(idGruppo);
		}
		return idsGruppi;
	}
		
	public List<IDRuolo> getIdsRuoli(String ids) {
		List<IDRuolo> idsRuoli = new ArrayList<>();
		ArrayList<String> idsToExport = Utilities.parseIdsToRemove(ids);
		for (String id : idsToExport) {
			IDRuolo idRuolo = new IDRuolo(id);
			idsRuoli.add(idRuolo);
		}
		return idsRuoli;
	}
	
	public List<IDScope> getIdsScope(String ids) {
		List<IDScope> idsScope = new ArrayList<>();
		ArrayList<String> idsToExport = Utilities.parseIdsToRemove(ids);
		for (String id : idsToExport) {
			IDScope idScope = new IDScope(id);
			idsScope.add(idScope);
		}
		return idsScope;
	}
	
	public List<CanaleConfigurazione> getIdsCanali(String ids) {
		List<CanaleConfigurazione> idsCanali = new ArrayList<>();
		ArrayList<String> idsToExport = Utilities.parseIdsToRemove(ids);
		for (String id : idsToExport) {
			CanaleConfigurazione canale = new CanaleConfigurazione();
			canale.setNome(id);
			idsCanali.add(canale);
		}
		return idsCanali;
	}
	
	public List<IDGenericProperties> getIdsAttributeAuthority(String ids) throws DriverConfigurazioneException, DriverConfigurazioneNotFound{
		return getIdsTokenPolicy(ids); // รจ uguale
	}
	public List<IDGenericProperties> getIdsTokenPolicy(String ids) throws DriverConfigurazioneException, DriverConfigurazioneNotFound{
		List<IDGenericProperties> idsTokenPolicy = new ArrayList<>();
		ArrayList<String> idsToExport = Utilities.parseIdsToRemove(ids);
		for (String id : idsToExport) {
			long idGenericProperties = Long.parseLong(id);
			GenericProperties policy = this.confCore.getGenericProperties(idGenericProperties);
			
			IDGenericProperties idGP = new IDGenericProperties();
			idGP.setNome(policy.getNome());
			idGP.setTipologia(policy.getTipologia());
			idsTokenPolicy.add(idGP);
		}
		return idsTokenPolicy;
	}
	
	public List<IdPolicy> getIdsControlloTrafficoConfigPolicy(String ids) throws DriverControlStationNotFound, DriverControlStationException{
		List<IdPolicy> idsRateLimitingPolicy = new ArrayList<>();
		ArrayList<String> idsToExport = Utilities.parseIdsToRemove(ids);
		for (String id : idsToExport) {
			long idPolicy = Long.parseLong(id);
			ConfigurazionePolicy policy = this.confCore.getConfigurazionePolicy(idPolicy);
			
			IdPolicy idGP = new IdPolicy();
			idGP.setNome(policy.getIdPolicy());
			idsRateLimitingPolicy.add(idGP);
		}
		return idsRateLimitingPolicy;
	}
	
	public List<IdActivePolicy> getIdsControlloTrafficoActivePolicy(String ids) throws DriverControlStationNotFound, DriverControlStationException{
		List<IdActivePolicy> idsRateLimitingPolicy = new ArrayList<>();
		ArrayList<String> idsToExport = Utilities.parseIdsToRemove(ids);
		for (String id : idsToExport) {
			long idPolicy = Long.parseLong(id);
			AttivazionePolicy attivazionePolicy =  this.confCore.getAttivazionePolicy(idPolicy); 
			
			IdActivePolicy idAttivazionePolicy = new IdActivePolicy();
			idAttivazionePolicy.setNome(attivazionePolicy.getIdActivePolicy());
			idAttivazionePolicy.setIdPolicy(attivazionePolicy.getIdPolicy());
			idAttivazionePolicy.setAlias(attivazionePolicy.getAlias());
			idAttivazionePolicy.setEnabled(attivazionePolicy.isEnabled());
			idAttivazionePolicy.setUpdateTime(attivazionePolicy.getUpdateTime());
			idAttivazionePolicy.setPosizione(attivazionePolicy.getPosizione());
			idAttivazionePolicy.setContinuaValutazione(attivazionePolicy.isContinuaValutazione());
			if(attivazionePolicy.getFiltro()!=null) {
				idAttivazionePolicy.setFiltroRuoloPorta(attivazionePolicy.getFiltro().getRuoloPorta());
				idAttivazionePolicy.setFiltroNomePorta(attivazionePolicy.getFiltro().getNomePorta());
			}
			idsRateLimitingPolicy.add(idAttivazionePolicy);
		}
		return idsRateLimitingPolicy;
	}
	
	public List<IdAllarme> getIdsAllarmi(String ids) throws DriverControlStationException{
		List<IdAllarme> idsAllarmi = new ArrayList<>();
		ArrayList<String> idsToExport = Utilities.parseIdsToRemove(ids);
		for (String id : idsToExport) {
			long idAllarmeLong = Long.parseLong(id);
			Allarme allarme = this.confCore.getAllarmeSenzaPlugin(idAllarmeLong);
			
			IdAllarme idAllarme = new IdAllarme();
			idAllarme.setNome(allarme.getNome());
			idAllarme.setTipo(allarme.getTipo());
			idAllarme.setEnabled(allarme.getEnabled());
			idAllarme.setAlias(allarme.getAlias());
			if(allarme.getFiltro()!=null) {
				idAllarme.setFiltroRuoloPorta(allarme.getFiltro().getRuoloPorta());
				idAllarme.setFiltroNomePorta(allarme.getFiltro().getNomePorta());
			}
			idsAllarmi.add(idAllarme);
		}
		return idsAllarmi;
	}
	
	public List<IdPlugin> getIdsPluginClassi(String ids) throws DriverConfigurazioneException{
		List<IdPlugin> idsPlugins = new ArrayList<>();
		ArrayList<String> idsToExport = Utilities.parseIdsToRemove(ids);
		for (String id : idsToExport) {
			long idPluginLong = Long.parseLong(id);
			Plugin plugin = this.confCore.getPlugin(idPluginLong);
			
			IdPlugin idPlugin = new IdPlugin();
			idPlugin.setClassName(plugin.getClassName());
			idPlugin.setLabel(plugin.getLabel());
			idPlugin.setTipo(plugin.getTipo());
			idPlugin.setTipoPlugin(plugin.getTipoPlugin());
			idsPlugins.add(idPlugin);
		}
		return idsPlugins;
	}
	
	public List<String> getIdsPluginArchivi(String ids) {
		List<String> idsPlugins = new ArrayList<>();
		ArrayList<String> idsToExport = Utilities.parseIdsToRemove(ids);
		for (String id : idsToExport) {
			idsPlugins.add(id);
		}
		return idsPlugins;
	}
	
	public List<String> getIdsUrlInvocazioneRegole(String ids) throws DriverConfigurazioneException, DriverConfigurazioneNotFound{
		
		ConfigurazioneUrlInvocazione urlInvocazione = this.confCore.getConfigurazioneGenerale().getUrlInvocazione();
		
		List<String> idsRegole = new ArrayList<>();
		ArrayList<String> idsToExport = Utilities.parseIdsToRemove(ids);
		for (String id : idsToExport) {
			long idRegolaLong = Long.parseLong(id);
			
			for (int j = 0; j < urlInvocazione.sizeRegolaList(); j++) {
				ConfigurazioneUrlInvocazioneRegola regola = urlInvocazione.getRegola(j); 
				if (regola.getId().longValue() == idRegolaLong) {
					idsRegole.add(regola.getNome());
					break;
				}
			}
		}
		return idsRegole;
	}
	
	public void filterByProtocol(List<String> tipiSoggetti,List<String> tipiServizi,Archive archive) throws ProtocolException {
		
		// soggetti
		if(archive.getSoggetti()!=null && archive.getSoggetti().size()>0) {
			List<ArchiveSoggetto> listFiltrata = new ArrayList<>();
			for (int i = 0; i < archive.getSoggetti().size(); i++) {
				if(archive.getSoggetti().get(i).getIdSoggetto()!=null &&
						tipiSoggetti.contains(archive.getSoggetti().get(i).getIdSoggetto().getTipo())) {
					listFiltrata.add(archive.getSoggetti().get(i));
				}
			}
			while(archive.getSoggetti().size()>0) {
				archive.getSoggetti().remove(0);
			}
			if(!listFiltrata.isEmpty()) {
				for (ArchiveSoggetto archiveFiltrato : listFiltrata) {
					archive.getSoggetti().add(archiveFiltrato);		
				}
			}
		}
		
		// servizio applicativo
		if(archive.getServiziApplicativi()!=null && archive.getServiziApplicativi().size()>0) {
			List<ArchiveServizioApplicativo> listFiltrata = new ArrayList<>();
			for (int i = 0; i < archive.getServiziApplicativi().size(); i++) {
				if(archive.getServiziApplicativi().get(i).getIdSoggettoProprietario()!=null &&
						tipiSoggetti.contains(archive.getServiziApplicativi().get(i).getIdSoggettoProprietario().getTipo())) {
					listFiltrata.add(archive.getServiziApplicativi().get(i));
				}
			}
			while(archive.getServiziApplicativi().size()>0) {
				archive.getServiziApplicativi().remove(0);
			}
			if(!listFiltrata.isEmpty()) {
				for (ArchiveServizioApplicativo archiveFiltrato : listFiltrata) {
					archive.getServiziApplicativi().add(archiveFiltrato);		
				}
			}
		}
		
		// porta delegata
		if(archive.getPorteDelegate()!=null && archive.getPorteDelegate().size()>0) {
			List<ArchivePortaDelegata> listFiltrata = new ArrayList<>();
			for (int i = 0; i < archive.getPorteDelegate().size(); i++) {
				if(archive.getPorteDelegate().get(i).getIdSoggettoProprietario()!=null &&
						tipiSoggetti.contains(archive.getPorteDelegate().get(i).getIdSoggettoProprietario().getTipo())) {
					listFiltrata.add(archive.getPorteDelegate().get(i));
				}
			}
			while(archive.getPorteDelegate().size()>0) {
				archive.getPorteDelegate().remove(0);
			}
			if(!listFiltrata.isEmpty()) {
				for (ArchivePortaDelegata archiveFiltrato : listFiltrata) {
					archive.getPorteDelegate().add(archiveFiltrato);		
				}
			}
		}
		
		// porta applicativa
		if(archive.getPorteApplicative()!=null && archive.getPorteApplicative().size()>0) {
			List<ArchivePortaApplicativa> listFiltrata = new ArrayList<>();
			for (int i = 0; i < archive.getPorteApplicative().size(); i++) {
				if(archive.getPorteApplicative().get(i).getIdSoggettoProprietario()!=null &&
						tipiSoggetti.contains(archive.getPorteApplicative().get(i).getIdSoggettoProprietario().getTipo())) {
					listFiltrata.add(archive.getPorteApplicative().get(i));
				}
			}
			while(archive.getPorteApplicative().size()>0) {
				archive.getPorteApplicative().remove(0);
			}
			if(!listFiltrata.isEmpty()) {
				for (ArchivePortaApplicativa archiveFiltrato : listFiltrata) {
					archive.getPorteApplicative().add(archiveFiltrato);		
				}
			}
		}
		
		// accordi cooperazione
		if(archive.getAccordiCooperazione()!=null && archive.getAccordiCooperazione().size()>0) {
			List<ArchiveAccordoCooperazione> listFiltrata = new ArrayList<>();
			for (int i = 0; i < archive.getAccordiCooperazione().size(); i++) {
				if(archive.getAccordiCooperazione().get(i).getIdSoggettoReferente()!=null &&
						tipiSoggetti.contains(archive.getAccordiCooperazione().get(i).getIdSoggettoReferente().getTipo())) {
					listFiltrata.add(archive.getAccordiCooperazione().get(i));
				}
			}
			while(archive.getAccordiCooperazione().size()>0) {
				archive.getAccordiCooperazione().remove(0);
			}
			if(!listFiltrata.isEmpty()) {
				for (ArchiveAccordoCooperazione archiveFiltrato : listFiltrata) {
					archive.getAccordiCooperazione().add(archiveFiltrato);		
				}
			}
		}
		
		// accordi parte comune
		if(archive.getAccordiServizioParteComune()!=null && archive.getAccordiServizioParteComune().size()>0) {
			List<ArchiveAccordoServizioParteComune> listFiltrata = new ArrayList<>();
			for (int i = 0; i < archive.getAccordiServizioParteComune().size(); i++) {
				if(archive.getAccordiServizioParteComune().get(i).getIdSoggettoReferente()!=null &&
						tipiSoggetti.contains(archive.getAccordiServizioParteComune().get(i).getIdSoggettoReferente().getTipo())) {
					listFiltrata.add(archive.getAccordiServizioParteComune().get(i));
				}
			}
			while(archive.getAccordiServizioParteComune().size()>0) {
				archive.getAccordiServizioParteComune().remove(0);
			}
			if(!listFiltrata.isEmpty()) {
				for (ArchiveAccordoServizioParteComune archiveFiltrato : listFiltrata) {
					archive.getAccordiServizioParteComune().add(archiveFiltrato);		
				}
			}
		}
		
		// accordi composto
		if(archive.getAccordiServizioComposto()!=null && archive.getAccordiServizioComposto().size()>0) {
			List<ArchiveAccordoServizioComposto> listFiltrata = new ArrayList<>();
			for (int i = 0; i < archive.getAccordiServizioComposto().size(); i++) {
				if(archive.getAccordiServizioComposto().get(i).getIdSoggettoReferente()!=null &&
						tipiSoggetti.contains(archive.getAccordiServizioComposto().get(i).getIdSoggettoReferente().getTipo())) {
					listFiltrata.add(archive.getAccordiServizioComposto().get(i));
				}
			}
			while(archive.getAccordiServizioComposto().size()>0) {
				archive.getAccordiServizioComposto().remove(0);
			}
			if(!listFiltrata.isEmpty()) {
				for (ArchiveAccordoServizioComposto archiveFiltrato : listFiltrata) {
					archive.getAccordiServizioComposto().add(archiveFiltrato);		
				}
			}
		}
		
		// accordi parte specifica
		if(archive.getAccordiServizioParteSpecifica()!=null && archive.getAccordiServizioParteSpecifica().size()>0) {
			List<ArchiveAccordoServizioParteSpecifica> listFiltrata = new ArrayList<>();
			for (int i = 0; i < archive.getAccordiServizioParteSpecifica().size(); i++) {
				if(archive.getAccordiServizioParteSpecifica().get(i).getIdSoggettoErogatore()!=null &&
						tipiSoggetti.contains(archive.getAccordiServizioParteSpecifica().get(i).getIdSoggettoErogatore().getTipo())) {
					listFiltrata.add(archive.getAccordiServizioParteSpecifica().get(i));
				}
			}
			while(archive.getAccordiServizioParteSpecifica().size()>0) {
				archive.getAccordiServizioParteSpecifica().remove(0);
			}
			if(!listFiltrata.isEmpty()) {
				for (ArchiveAccordoServizioParteSpecifica archiveFiltrato : listFiltrata) {
					archive.getAccordiServizioParteSpecifica().add(archiveFiltrato);		
				}
			}
		}
		
		// fruitori
		if(archive.getAccordiFruitori()!=null && archive.getAccordiFruitori().size()>0) {
			List<ArchiveFruitore> listFiltrata = new ArrayList<>();
			for (int i = 0; i < archive.getAccordiFruitori().size(); i++) {
				if(archive.getAccordiFruitori().get(i).getIdSoggettoFruitore()!=null &&
						tipiSoggetti.contains(archive.getAccordiFruitori().get(i).getIdSoggettoFruitore().getTipo())) {
					listFiltrata.add(archive.getAccordiFruitori().get(i));
				}
			}
			while(archive.getAccordiFruitori().size()>0) {
				archive.getAccordiFruitori().remove(0);
			}
			if(!listFiltrata.isEmpty()) {
				for (ArchiveFruitore archiveFiltrato : listFiltrata) {
					archive.getAccordiFruitori().add(archiveFiltrato);		
				}
			}
		}
		
		// controllo del traffico
		if(archive.getControlloTraffico_activePolicies()!=null && archive.getControlloTraffico_activePolicies().size()>0) {
			List<ArchiveActivePolicy> listFiltrata = new ArrayList<>();
			for (int i = 0; i < archive.getControlloTraffico_activePolicies().size(); i++) {
				ArchiveActivePolicy archivePolicy = archive.getControlloTraffico_activePolicies().get(i);
				boolean filtra = false;
				if(archivePolicy.getPolicy().getFiltro()!=null) {
					if(archivePolicy.getPolicy().getFiltro().getTipoErogatore()!=null &&
						!tipiSoggetti.contains(archivePolicy.getPolicy().getFiltro().getTipoErogatore())) {
						filtra = true;
					}
					if(archivePolicy.getPolicy().getFiltro().getTipoFruitore()!=null &&
						!tipiSoggetti.contains(archivePolicy.getPolicy().getFiltro().getTipoFruitore())) {
						filtra = true;
					}
					if(archivePolicy.getPolicy().getFiltro().getTipoServizio()!=null &&
						!tipiServizi.contains(archivePolicy.getPolicy().getFiltro().getTipoServizio())) {
						filtra = true;
					}
				}
				if(!filtra) {
					listFiltrata.add(archivePolicy);
				}
			}
			while(archive.getControlloTraffico_activePolicies().size()>0) {
				archive.getControlloTraffico_activePolicies().remove(0);
			}
			if(!listFiltrata.isEmpty()) {
				for (ArchiveActivePolicy archiveFiltrato : listFiltrata) {
					archive.getControlloTraffico_activePolicies().add(archiveFiltrato);		
				}
			}
		}
		
		// allarmi
		if(archive.getAllarmi()!=null && archive.getAllarmi().size()>0) {
			List<ArchiveAllarme> listFiltrata = new ArrayList<>();
			for (int i = 0; i < archive.getAllarmi().size(); i++) {
				ArchiveAllarme archiveAllarme = archive.getAllarmi().get(i);
				boolean filtra = false;
				if(archiveAllarme.getAllarme().getFiltro()!=null) {
					if(archiveAllarme.getAllarme().getFiltro().getTipoErogatore()!=null &&
						!tipiSoggetti.contains(archiveAllarme.getAllarme().getFiltro().getTipoErogatore())) {
						filtra = true;
					}
					if(archiveAllarme.getAllarme().getFiltro().getTipoFruitore()!=null &&
						!tipiSoggetti.contains(archiveAllarme.getAllarme().getFiltro().getTipoFruitore())) {
						filtra = true;
					}
					if(archiveAllarme.getAllarme().getFiltro().getTipoServizio()!=null &&
						!tipiServizi.contains(archiveAllarme.getAllarme().getFiltro().getTipoServizio())) {
						filtra = true;
					}
				}
				if(!filtra) {
					listFiltrata.add(archiveAllarme);
				}
			}
			while(archive.getAllarmi().size()>0) {
				archive.getAllarmi().remove(0);
			}
			if(!listFiltrata.isEmpty()) {
				for (ArchiveAllarme archiveFiltrato : listFiltrata) {
					archive.getAllarmi().add(archiveFiltrato);		
				}
			}
		}
		
	}
	
	public void filterBySoggettoSelezionato(IDSoggetto idSoggettoSelezionato,Archive archive) throws ProtocolException {
		
		List<IDSoggetto> idSoggettiCoinvolti = new ArrayList<>();
		idSoggettiCoinvolti.add(idSoggettoSelezionato);
		
		List<IDServizio> idServiziCoinvolti = new ArrayList<>();
		List<IDServizioApplicativo> idServiziApplicativiCoinvolti = new ArrayList<>();
		List<IDAccordo> idAccordiCoinvolti = new ArrayList<>();
		List<IDAccordoCooperazione> idAccordiCooperazioneCoinvolti = new ArrayList<>();
			
	
		/* --  Raccolgo elementi riferiti dal soggetto selezionato  -- */
		
		// servizio applicativo
		if(archive.getServiziApplicativi()!=null && archive.getServiziApplicativi().size()>0) {
			for (int i = 0; i < archive.getServiziApplicativi().size(); i++) {
				if(archive.getServiziApplicativi().get(i).getIdSoggettoProprietario()!=null &&
						idSoggettoSelezionato.equals(archive.getServiziApplicativi().get(i).getIdSoggettoProprietario())) {
					
					IDServizioApplicativo idSA = archive.getServiziApplicativi().get(i).getIdServizioApplicativo();
					if(!idServiziApplicativiCoinvolti.contains(idSA)) {
						idServiziApplicativiCoinvolti.add(idSA);
					}
				}
			}
		}
		
		// porta delegata
		if(archive.getPorteDelegate()!=null && archive.getPorteDelegate().size()>0) {
			for (int i = 0; i < archive.getPorteDelegate().size(); i++) {
				if(archive.getPorteDelegate().get(i).getIdSoggettoProprietario()!=null &&
						idSoggettoSelezionato.equals(archive.getPorteDelegate().get(i).getIdSoggettoProprietario())) {
					
					IDServizio idServizio = archive.getPorteDelegate().get(i).getIdPortaDelegata().getIdentificativiFruizione().getIdServizio();
					IDSoggetto idSoggettoErogatore = idServizio.getSoggettoErogatore();
					if(!idSoggettiCoinvolti.contains(idSoggettoErogatore)) {
						idSoggettiCoinvolti.add(idSoggettoErogatore);
					}
					if(!idServiziCoinvolti.contains(idServizio)) {
						idServiziCoinvolti.add(idServizio);
					}
				}
			}
		}
		
		// porta applicativa
		if(archive.getPorteApplicative()!=null && archive.getPorteApplicative().size()>0) {
			for (int i = 0; i < archive.getPorteApplicative().size(); i++) {
				if(archive.getPorteApplicative().get(i).getIdSoggettoProprietario()!=null &&
						idSoggettoSelezionato.equals(archive.getPorteApplicative().get(i).getIdSoggettoProprietario())) {
					
					PortaApplicativa pa = archive.getPorteApplicative().get(i).getPortaApplicativa();
					if(pa.getSoggetti()!=null && pa.getSoggetti().sizeSoggettoList()>0) {
						for (int j = 0; j < pa.getSoggetti().sizeSoggettoList(); j++) {
							PortaApplicativaAutorizzazioneSoggetto authSoggetto = pa.getSoggetti().getSoggetto(j);
							IDSoggetto idSoggettoAutorizzato = new IDSoggetto(authSoggetto.getTipo(), authSoggetto.getNome());
							if(!idSoggettiCoinvolti.contains(idSoggettoAutorizzato)) {
								idSoggettiCoinvolti.add(idSoggettoAutorizzato);
							}
						}
					}
					if(pa.getServiziApplicativiAutorizzati()!=null && pa.getServiziApplicativiAutorizzati().sizeServizioApplicativoList()>0) {
						for (int j = 0; j < pa.getServiziApplicativiAutorizzati().sizeServizioApplicativoList(); j++) {
							PortaApplicativaAutorizzazioneServizioApplicativo authSA = pa.getServiziApplicativiAutorizzati().getServizioApplicativo(j);
							IDSoggetto idSoggettoProprietarioSAAutorizzato = new IDSoggetto(authSA.getTipoSoggettoProprietario(), authSA.getNomeSoggettoProprietario());
							if(!idSoggettiCoinvolti.contains(idSoggettoProprietarioSAAutorizzato)) {
								idSoggettiCoinvolti.add(idSoggettoProprietarioSAAutorizzato);
							}
							IDServizioApplicativo idSAAutorizzato = new IDServizioApplicativo();
							idSAAutorizzato.setIdSoggettoProprietario(idSoggettoProprietarioSAAutorizzato);
							idSAAutorizzato.setNome(authSA.getNome());
							if(!idServiziApplicativiCoinvolti.contains(idSAAutorizzato)) {
								idServiziApplicativiCoinvolti.add(idSAAutorizzato);
							}
						}
					}
				}
			}
		}
		
		// accordi cooperazione
		if(archive.getAccordiCooperazione()!=null && archive.getAccordiCooperazione().size()>0) {
			for (int i = 0; i < archive.getAccordiCooperazione().size(); i++) {
				if(archive.getAccordiCooperazione().get(i).getIdSoggettoReferente()!=null &&
						idSoggettoSelezionato.equals(archive.getAccordiCooperazione().get(i).getIdSoggettoReferente())) {
					
					IDAccordoCooperazione idAC = archive.getAccordiCooperazione().get(i).getIdAccordoCooperazione();
					if(!idAccordiCooperazioneCoinvolti.contains(idAC)) {
						idAccordiCooperazioneCoinvolti.add(idAC);
					} 
					
					IDSoggetto idSoggettoReferente = archive.getAccordiCooperazione().get(i).getIdSoggettoReferente();
					if(!idSoggettiCoinvolti.contains(idSoggettoReferente)) {
						idSoggettiCoinvolti.add(idSoggettoReferente);
					}
				}
			}
		}
		
		// accordi parte comune (raccolgo solo elementi riferiti, l'eliminazione la faccio dopo)
		if(archive.getAccordiServizioParteComune()!=null && archive.getAccordiServizioParteComune().size()>0) {
			for (int i = 0; i < archive.getAccordiServizioParteComune().size(); i++) {
				
				// filtro solo se il protocollo supporta il soggetto referente.
				if(archive.getAccordiServizioParteComune().get(i).getIdSoggettoReferente()!=null) {
					try {
						String protocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(archive.getAccordiServizioParteComune().get(i).getIdSoggettoReferente().getTipo());
						boolean soggettoReferenteSupportato = this.aspcCore.isSupportatoSoggettoReferente(protocollo);
						
						if( !soggettoReferenteSupportato ||
								idSoggettoSelezionato.equals(archive.getAccordiServizioParteComune().get(i).getIdSoggettoReferente())) {
							
							IDAccordo idAccordo = archive.getAccordiServizioParteComune().get(i).getIdAccordoServizioParteComune();
							if(!idAccordiCoinvolti.contains(idAccordo)) {
								idAccordiCoinvolti.add(idAccordo);
							}
							
							IDSoggetto idSoggettoReferente = archive.getAccordiServizioParteComune().get(i).getIdSoggettoReferente();
							if(!idSoggettiCoinvolti.contains(idSoggettoReferente)) {
								idSoggettiCoinvolti.add(idSoggettoReferente);
							}
						}
					}catch(Exception e) {
						throw new ProtocolException(e.getMessage(), e);
					}
				}
			}
		}
		
		// accordi composto  (raccolgo solo elementi riferiti, l'eliminazione la faccio dopo)
		if(archive.getAccordiServizioComposto()!=null && archive.getAccordiServizioComposto().size()>0) {
			for (int i = 0; i < archive.getAccordiServizioComposto().size(); i++) {
				if(archive.getAccordiServizioComposto().get(i).getIdSoggettoReferente()!=null &&
						idSoggettoSelezionato.equals(archive.getAccordiServizioComposto().get(i).getIdSoggettoReferente())) {
					
					IDAccordo idAccordo = archive.getAccordiServizioComposto().get(i).getIdAccordoServizioParteComune();
					if(!idAccordiCoinvolti.contains(idAccordo)) {
						idAccordiCoinvolti.add(idAccordo);
					}
					
					IDSoggetto idSoggettoReferente = archive.getAccordiServizioComposto().get(i).getIdSoggettoReferente();
					if(!idSoggettiCoinvolti.contains(idSoggettoReferente)) {
						idSoggettiCoinvolti.add(idSoggettoReferente);
					}
					
					AccordoServizioParteComune apc = archive.getAccordiServizioComposto().get(i).getAccordoServizioParteComune();
					if(apc.getServizioComposto()!=null) {
						if(apc.getServizioComposto().sizeServizioComponenteList()>0) {
							for (int j = 0; j < apc.getServizioComposto().sizeServizioComponenteList(); j++) {
								AccordoServizioParteComuneServizioCompostoServizioComponente componente = apc.getServizioComposto().getServizioComponente(j);
								try {
									IDServizio idServizioComponente = IDServizioFactory.getInstance().getIDServizioFromValues(componente.getTipo(), componente.getNome(), 
											componente.getTipoSoggetto(), componente.getNomeSoggetto(), componente.getVersione());
									if(!idServiziCoinvolti.contains(idServizioComponente)) {
										idServiziCoinvolti.add(idServizioComponente);
									}
								}catch(Exception e) {
									ControlStationCore.logError("AccordoServizioComposto ["+idAccordo+"]: "+e.getMessage(), e);
								}
							}
						}
						if(apc.getServizioComposto().getAccordoCooperazione()!=null) {
							String uriAC = apc.getServizioComposto().getAccordoCooperazione();
							try {
								IDAccordoCooperazione idAC = IDAccordoCooperazioneFactory.getInstance().getIDAccordoFromUri(uriAC);
								if(!idAccordiCooperazioneCoinvolti.contains(idAC)) {
									idAccordiCooperazioneCoinvolti.add(idAC);
								} 
							}catch(Exception e) {
								ControlStationCore.logError("AccordoServizioComposto ["+idAccordo+"]: "+e.getMessage(), e);
							}
						}
					}
				}
			}
		}
			
		// accordi parte specifica (raccolgo solo elementi riferiti, l'eliminazione la faccio dopo)
		if(archive.getAccordiServizioParteSpecifica()!=null && archive.getAccordiServizioParteSpecifica().size()>0) {
			for (int i = 0; i < archive.getAccordiServizioParteSpecifica().size(); i++) {
				if(archive.getAccordiServizioParteSpecifica().get(i).getIdSoggettoErogatore()!=null &&
						idSoggettoSelezionato.equals(archive.getAccordiServizioParteSpecifica().get(i).getIdSoggettoErogatore())) {
					
					IDServizio idServizio =  archive.getAccordiServizioParteSpecifica().get(i).getIdAccordoServizioParteSpecifica();
					if(!idServiziCoinvolti.contains(idServizio)) {
						idServiziCoinvolti.add(idServizio);
					}
					
					String uriAccordoServizioParteComune = archive.getAccordiServizioParteSpecifica().get(i).getAccordoServizioParteSpecifica().getAccordoServizioParteComune();
					try {
						IDAccordo idApc = IDAccordoFactory.getInstance().getIDAccordoFromUri(uriAccordoServizioParteComune);
						if(!idAccordiCoinvolti.contains(idApc)) {
							idAccordiCoinvolti.add(idApc);
						}
					}catch(Exception e) {
						ControlStationCore.logError("AccordoServizioParteSpecifica ["+idServizio+"]: "+e.getMessage(), e);
					}
				}
			}
		}
		
		// fruitori
		if(archive.getAccordiFruitori()!=null && archive.getAccordiFruitori().size()>0) {
			for (int i = 0; i < archive.getAccordiFruitori().size(); i++) {
				if(archive.getAccordiFruitori().get(i).getIdSoggettoFruitore()!=null &&
						idSoggettoSelezionato.equals(archive.getAccordiFruitori().get(i).getIdSoggettoFruitore())) {
					
					IDServizio idServizio =  archive.getAccordiFruitori().get(i).getIdAccordoServizioParteSpecifica();
					IDSoggetto idSoggettoErogatore = idServizio.getSoggettoErogatore();
					if(!idSoggettiCoinvolti.contains(idSoggettoErogatore)) {
						idSoggettiCoinvolti.add(idSoggettoErogatore);
					}
					if(!idServiziCoinvolti.contains(idServizio)) {
						idServiziCoinvolti.add(idServizio);
					}
					
					// verifico accordi coinvolti dalla fruizione
					if(archive.getAccordiServizioParteSpecifica()!=null && archive.getAccordiServizioParteSpecifica().size()>0) {
						for (int j = 0; j < archive.getAccordiServizioParteSpecifica().size(); j++) {
							IDServizio idServizioCheck =  archive.getAccordiServizioParteSpecifica().get(j).getIdAccordoServizioParteSpecifica();
							if(idServizio.equals(idServizioCheck)) {
								
								String uriAccordoServizioParteComune = archive.getAccordiServizioParteSpecifica().get(j).getAccordoServizioParteSpecifica().getAccordoServizioParteComune();
								try {
									IDAccordo idApc = IDAccordoFactory.getInstance().getIDAccordoFromUri(uriAccordoServizioParteComune);
									if(!idAccordiCoinvolti.contains(idApc)) {
										idAccordiCoinvolti.add(idApc);
									}
								}catch(Exception e) {
									ControlStationCore.logError("Fruitore["+idSoggettoSelezionato+"] AccordoServizioParteSpecifica ["+idServizio+"]: "+e.getMessage(), e);
								}
								
								break;
							}
						}
					}
				}
			}
		}
		
		
		
		
		
		
		/* Filtro elementi */
		
		// soggetti
		if(archive.getSoggetti()!=null && archive.getSoggetti().size()>0) {
			List<ArchiveSoggetto> listFiltrata = new ArrayList<>();
			for (int i = 0; i < archive.getSoggetti().size(); i++) {
				if(archive.getSoggetti().get(i).getIdSoggetto()!=null &&
						idSoggettiCoinvolti.contains(archive.getSoggetti().get(i).getIdSoggetto())) {
					listFiltrata.add(archive.getSoggetti().get(i));
				}
			}
			while(archive.getSoggetti().size()>0) {
				archive.getSoggetti().remove(0);
			}
			if(!listFiltrata.isEmpty()) {
				for (ArchiveSoggetto archiveFiltrato : listFiltrata) {
					archive.getSoggetti().add(archiveFiltrato);		
				}
			}
		}
		
		// servizio applicativo
		if(archive.getServiziApplicativi()!=null && archive.getServiziApplicativi().size()>0) {
			List<ArchiveServizioApplicativo> listFiltrata = new ArrayList<>();
			for (int i = 0; i < archive.getServiziApplicativi().size(); i++) {
				if(archive.getServiziApplicativi().get(i).getIdSoggettoProprietario()!=null &&
						idServiziApplicativiCoinvolti.contains(archive.getServiziApplicativi().get(i).getIdServizioApplicativo())) {
					listFiltrata.add(archive.getServiziApplicativi().get(i));
				}
			}
			while(archive.getServiziApplicativi().size()>0) {
				archive.getServiziApplicativi().remove(0);
			}
			if(!listFiltrata.isEmpty()) {
				for (ArchiveServizioApplicativo archiveFiltrato : listFiltrata) {
					archive.getServiziApplicativi().add(archiveFiltrato);		
				}
			}
		}
		
		// porta delegata
		if(archive.getPorteDelegate()!=null && archive.getPorteDelegate().size()>0) {
			List<ArchivePortaDelegata> listFiltrata = new ArrayList<>();
			for (int i = 0; i < archive.getPorteDelegate().size(); i++) {
				if(archive.getPorteDelegate().get(i).getIdSoggettoProprietario()!=null &&
						idSoggettoSelezionato.equals(archive.getPorteDelegate().get(i).getIdSoggettoProprietario())) {
					listFiltrata.add(archive.getPorteDelegate().get(i));
				}
			}
			while(archive.getPorteDelegate().size()>0) {
				archive.getPorteDelegate().remove(0);
			}
			if(!listFiltrata.isEmpty()) {
				for (ArchivePortaDelegata archiveFiltrato : listFiltrata) {
					archive.getPorteDelegate().add(archiveFiltrato);		
				}
			}
		}
		
		// porta applicativa
		if(archive.getPorteApplicative()!=null && archive.getPorteApplicative().size()>0) {
			List<ArchivePortaApplicativa> listFiltrata = new ArrayList<>();
			for (int i = 0; i < archive.getPorteApplicative().size(); i++) {
				if(archive.getPorteApplicative().get(i).getIdSoggettoProprietario()!=null &&
						idSoggettoSelezionato.equals(archive.getPorteApplicative().get(i).getIdSoggettoProprietario())) {
					listFiltrata.add(archive.getPorteApplicative().get(i));
				}
			}
			while(archive.getPorteApplicative().size()>0) {
				archive.getPorteApplicative().remove(0);
			}
			if(!listFiltrata.isEmpty()) {
				for (ArchivePortaApplicativa archiveFiltrato : listFiltrata) {
					archive.getPorteApplicative().add(archiveFiltrato);		
				}
			}
		}
		
		// accordi cooperazione
		if(archive.getAccordiCooperazione()!=null && archive.getAccordiCooperazione().size()>0) {
			List<ArchiveAccordoCooperazione> listFiltrata = new ArrayList<>();
			for (int i = 0; i < archive.getAccordiCooperazione().size(); i++) {
				if(archive.getAccordiCooperazione().get(i).getIdSoggettoReferente()!=null &&
						idAccordiCooperazioneCoinvolti.contains(archive.getAccordiCooperazione().get(i).getIdAccordoCooperazione())) {
					listFiltrata.add(archive.getAccordiCooperazione().get(i));
				}
			}
			while(archive.getAccordiCooperazione().size()>0) {
				archive.getAccordiCooperazione().remove(0);
			}
			if(!listFiltrata.isEmpty()) {
				for (ArchiveAccordoCooperazione archiveFiltrato : listFiltrata) {
					archive.getAccordiCooperazione().add(archiveFiltrato);		
				}
			}
		}
		
		// accordi parte comune
		if(archive.getAccordiServizioParteComune()!=null && archive.getAccordiServizioParteComune().size()>0) {
			List<ArchiveAccordoServizioParteComune> listFiltrata = new ArrayList<>();
			for (int i = 0; i < archive.getAccordiServizioParteComune().size(); i++) {
				if(archive.getAccordiServizioParteComune().get(i).getIdSoggettoReferente()!=null &&
						idAccordiCoinvolti.contains(archive.getAccordiServizioParteComune().get(i).getIdAccordoServizioParteComune())) {
					listFiltrata.add(archive.getAccordiServizioParteComune().get(i));
				}
			}
			while(archive.getAccordiServizioParteComune().size()>0) {
				archive.getAccordiServizioParteComune().remove(0);
			}
			if(!listFiltrata.isEmpty()) {
				for (ArchiveAccordoServizioParteComune archiveFiltrato : listFiltrata) {
					archive.getAccordiServizioParteComune().add(archiveFiltrato);		
				}
			}
		}
		
		// accordi composto
		if(archive.getAccordiServizioComposto()!=null && archive.getAccordiServizioComposto().size()>0) {
			List<ArchiveAccordoServizioComposto> listFiltrata = new ArrayList<>();
			for (int i = 0; i < archive.getAccordiServizioComposto().size(); i++) {
				if(archive.getAccordiServizioComposto().get(i).getIdSoggettoReferente()!=null &&
						idAccordiCoinvolti.contains(archive.getAccordiServizioComposto().get(i).getIdAccordoServizioParteComune())) {
					listFiltrata.add(archive.getAccordiServizioComposto().get(i));
				}
			}
			while(archive.getAccordiServizioComposto().size()>0) {
				archive.getAccordiServizioComposto().remove(0);
			}
			if(!listFiltrata.isEmpty()) {
				for (ArchiveAccordoServizioComposto archiveFiltrato : listFiltrata) {
					archive.getAccordiServizioComposto().add(archiveFiltrato);		
				}
			}
		}
		
		// accordi parte specifica
		if(archive.getAccordiServizioParteSpecifica()!=null && archive.getAccordiServizioParteSpecifica().size()>0) {
			List<ArchiveAccordoServizioParteSpecifica> listFiltrata = new ArrayList<>();
			for (int i = 0; i < archive.getAccordiServizioParteSpecifica().size(); i++) {
				if(archive.getAccordiServizioParteSpecifica().get(i).getIdSoggettoErogatore()!=null &&
						idServiziCoinvolti.contains(archive.getAccordiServizioParteSpecifica().get(i).getIdAccordoServizioParteSpecifica())) {
					listFiltrata.add(archive.getAccordiServizioParteSpecifica().get(i));
				}
			}
			while(archive.getAccordiServizioParteSpecifica().size()>0) {
				archive.getAccordiServizioParteSpecifica().remove(0);
			}
			if(!listFiltrata.isEmpty()) {
				for (ArchiveAccordoServizioParteSpecifica archiveFiltrato : listFiltrata) {
					archive.getAccordiServizioParteSpecifica().add(archiveFiltrato);		
				}
			}
		}
		

		// fruitori
		if(archive.getAccordiFruitori()!=null && archive.getAccordiFruitori().size()>0) {
			List<ArchiveFruitore> listFiltrata = new ArrayList<>();
			for (int i = 0; i < archive.getAccordiFruitori().size(); i++) {
				if(archive.getAccordiFruitori().get(i).getIdSoggettoFruitore()!=null &&
						idSoggettoSelezionato.equals(archive.getAccordiFruitori().get(i).getIdSoggettoFruitore())) {
					listFiltrata.add(archive.getAccordiFruitori().get(i));
				}
			}
			while(archive.getAccordiFruitori().size()>0) {
				archive.getAccordiFruitori().remove(0);
			}
			if(!listFiltrata.isEmpty()) {
				for (ArchiveFruitore archiveFiltrato : listFiltrata) {
					archive.getAccordiFruitori().add(archiveFiltrato);		
				}
			}
		}

		
		// controllo del traffico
		if(archive.getControlloTraffico_activePolicies()!=null && archive.getControlloTraffico_activePolicies().size()>0) {
			List<ArchiveActivePolicy> listFiltrata = new ArrayList<>();
			for (int i = 0; i < archive.getControlloTraffico_activePolicies().size(); i++) {
				ArchiveActivePolicy archivePolicy = archive.getControlloTraffico_activePolicies().get(i);
				boolean filtra = false;
				if(archivePolicy.getPolicy().getFiltro()!=null) {
					IDSoggetto idSoggettoErogatore = null;
					if(archivePolicy.getPolicy().getFiltro().getTipoErogatore()!=null && archivePolicy.getPolicy().getFiltro().getNomeErogatore()!=null) {
						idSoggettoErogatore = new IDSoggetto(archivePolicy.getPolicy().getFiltro().getTipoErogatore(), archivePolicy.getPolicy().getFiltro().getNomeErogatore());
						if(!idSoggettiCoinvolti.contains(idSoggettoErogatore)) {
							filtra = true;
						}
					}
					if(archivePolicy.getPolicy().getFiltro().getTipoFruitore()!=null && archivePolicy.getPolicy().getFiltro().getNomeFruitore()!=null) {
						IDSoggetto idSoggettoFruitore = new IDSoggetto(archivePolicy.getPolicy().getFiltro().getTipoFruitore(), archivePolicy.getPolicy().getFiltro().getNomeFruitore());
						if(!idSoggettiCoinvolti.contains(idSoggettoFruitore)) {
							filtra = true;
						}
					}
					if(idSoggettoErogatore!=null && 
							archivePolicy.getPolicy().getFiltro().getTipoServizio()!=null &&
							archivePolicy.getPolicy().getFiltro().getNomeServizio()!=null &&
							archivePolicy.getPolicy().getFiltro().getVersioneServizio()!=null) {
						try {
							IDServizio idServizio = IDServizioFactory.getInstance().getIDServizioFromValues(archivePolicy.getPolicy().getFiltro().getTipoServizio(), 
									archivePolicy.getPolicy().getFiltro().getNomeServizio(), 
									idSoggettoErogatore, 
									archivePolicy.getPolicy().getFiltro().getVersioneServizio());
							if(!idServiziCoinvolti.contains(idServizio)) {
								filtra = true;
							}
						}catch(Exception e) {
							ControlStationCore.logError("ControlloTraffico activePolicies ["+archivePolicy.getPolicy().getIdActivePolicy()+"]: "+e.getMessage(), e);
						}
					}
				}
				if(!filtra) {
					listFiltrata.add(archivePolicy);
				}
			}
			while(archive.getControlloTraffico_activePolicies().size()>0) {
				archive.getControlloTraffico_activePolicies().remove(0);
			}
			if(!listFiltrata.isEmpty()) {
				for (ArchiveActivePolicy archiveFiltrato : listFiltrata) {
					archive.getControlloTraffico_activePolicies().add(archiveFiltrato);		
				}
			}
		}
		
		
		// allarmi
		if(archive.getAllarmi()!=null && archive.getAllarmi().size()>0) {
			List<ArchiveAllarme> listFiltrata = new ArrayList<>();
			for (int i = 0; i < archive.getAllarmi().size(); i++) {
				ArchiveAllarme archiveAllarme = archive.getAllarmi().get(i);
				boolean filtra = false;
				if(archiveAllarme.getAllarme().getFiltro()!=null) {
					IDSoggetto idSoggettoErogatore = null;
					if(archiveAllarme.getAllarme().getFiltro().getTipoErogatore()!=null && archiveAllarme.getAllarme().getFiltro().getNomeErogatore()!=null) {
						idSoggettoErogatore = new IDSoggetto(archiveAllarme.getAllarme().getFiltro().getTipoErogatore(), archiveAllarme.getAllarme().getFiltro().getNomeErogatore());
						if(!idSoggettiCoinvolti.contains(idSoggettoErogatore)) {
							filtra = true;
						}
					}
					if(archiveAllarme.getAllarme().getFiltro().getTipoFruitore()!=null && archiveAllarme.getAllarme().getFiltro().getNomeFruitore()!=null) {
						IDSoggetto idSoggettoFruitore = new IDSoggetto(archiveAllarme.getAllarme().getFiltro().getTipoFruitore(), archiveAllarme.getAllarme().getFiltro().getNomeFruitore());
						if(!idSoggettiCoinvolti.contains(idSoggettoFruitore)) {
							filtra = true;
						}
					}
					if(idSoggettoErogatore!=null && 
							archiveAllarme.getAllarme().getFiltro().getTipoServizio()!=null &&
							archiveAllarme.getAllarme().getFiltro().getNomeServizio()!=null &&
							archiveAllarme.getAllarme().getFiltro().getVersioneServizio()!=null) {
						try {
							IDServizio idServizio = IDServizioFactory.getInstance().getIDServizioFromValues(archiveAllarme.getAllarme().getFiltro().getTipoServizio(), 
									archiveAllarme.getAllarme().getFiltro().getNomeServizio(), 
									idSoggettoErogatore, 
									archiveAllarme.getAllarme().getFiltro().getVersioneServizio());
							if(!idServiziCoinvolti.contains(idServizio)) {
								filtra = true;
							}
						}catch(Exception e) {
							ControlStationCore.logError("Allarmi ["+archiveAllarme.getAllarme().getNome()+"]: "+e.getMessage(), e);
						}
					}
				}
				if(!filtra) {
					listFiltrata.add(archiveAllarme);
				}
			}
			while(archive.getAllarmi().size()>0) {
				archive.getAllarmi().remove(0);
			}
			if(!listFiltrata.isEmpty()) {
				for (ArchiveAllarme archiveFiltrato : listFiltrata) {
					archive.getAllarmi().add(archiveFiltrato);		
				}
			}
		}
		
	}
}