ReadTimeoutConfigurationUtils.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.pdd.core.controllo_traffico;

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

import org.openspcoop2.core.config.PortaApplicativa;
import org.openspcoop2.core.config.PortaDelegata;
import org.openspcoop2.core.config.driver.DriverConfigurazioneException;
import org.openspcoop2.core.controllo_traffico.constants.RuoloPolicy;
import org.openspcoop2.core.id.IDException;
import org.openspcoop2.core.id.IDServizio;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.registry.driver.IDServizioFactory;
import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
import org.openspcoop2.pdd.core.connettori.ConnettoreUtils;
import org.openspcoop2.pdd.core.controllo_traffico.policy.PolicyDati;
import org.openspcoop2.pdd.core.controllo_traffico.policy.PolicyVerifier;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.ProtocolException;

/**     
 * ReadTimeoutConfigurationUtils
 *
 * @author Poli Andrea (poli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class ReadTimeoutConfigurationUtils {
	
	private ReadTimeoutConfigurationUtils() {}

	public static final String CONFIG_GLOBALE_PROPERTY = "Configurazione globale: ";
	public static final String CONFIG_TIMEOUT = "Timeout (ms): ";
	public static final String CONFIG_PROFILO = "Profilo: ";
	public static final String CONFIG_TIPOLOGIA = "Tipologia: ";
	public static final String CONFIG_TIPOLOGIA_VALUE_DELEGATA = "fruizione";
	public static final String CONFIG_TIPOLOGIA_VALUE_APPLICATIVA = "erogazione";
	public static final String CONFIG_FRUITORE = "Fruitore: ";
	public static final String CONFIG_EROGATORE = "Erogatore: ";
	public static final String CONFIG_SERVIZIO = "Servizio: ";
	public static final String CONFIG_GRUPPO = "Gruppo: ";
	public static final String CONFIG_CONNETTORE = "Connettore: ";
	public static final String CONFIG_POLICY_NEGOZIAZIONE = "Token Policy Negoziazione: ";
	public static final String CONFIG_POLICY_VALIDAZIONE_DYNAMIC_DISCOVERY = "Token Policy Dynamic Discovery: ";
	public static final String CONFIG_POLICY_VALIDAZIONE_JWT = "Token Policy Validazione JWT: ";
	public static final String CONFIG_POLICY_VALIDAZIONE_INTROSPECTION = "Token Policy Introspection: ";
	public static final String CONFIG_POLICY_VALIDAZIONE_USER_INFO = "Token Policy UserInfo: ";
	public static final String CONFIG_ATTRIBUTE_AUTHORITY = "Attribute Authority: ";
	public static final String CONFIG_ATTRIBUTE_AUTHORITY_VALIDAZIONE_RISPOSTA_JWT = "Attribute Authority - Risposta JWT: ";
	public static final String CONFIG_NOME_PORTA_INBOUND_PROPERTY = "Porta Inbound: ";
	public static final String CONFIG_NOME_PORTA_OUTBOUND_PROPERTY = "Porta Outbound: ";
	public static final String CONFIG_NOME_PORTA_PROPERTY = "Porta: ";

	public static final String ID_POLICY_NEGOZIAZIONE = "tokenRetrieve:";
	public static final String ID_POLICY_VALIDAZIONE_DYNAMIC_DISCOVERY = "tokenDynamicDiscovery:";
	public static final String ID_POLICY_VALIDAZIONE_JWT = "tokenJwtValidation:";
	public static final String ID_POLICY_VALIDAZIONE_INTROSPECTION = "tokenIntrospection:";
	public static final String ID_POLICY_VALIDAZIONE_USER_INFO = "tokenUserInfo:";
	public static final String ID_ATTRIBUTE_AUTHORITY = "attributeAuthority:";
	public static final String ID_ATTRIBUTE_AUTHORITY_VALIDAZIONE_RISPOSTA_JWT = "attributeAuthorityResponseJwtValidation:";
	
	public static PolicyDati convertToPolicyDati(String configurazione) throws IDException {
		PolicyDati dati = new PolicyDati();
		String [] tmp = configurazione.split("\n");
		if(tmp!=null && tmp.length>0) {
			dati.setProfilo(parse(tmp, CONFIG_PROFILO));
			dati.setRuoloPorta(parseRuoloPolicy(tmp, CONFIG_TIPOLOGIA));
			dati.setIdFruitore(parseIdSoggetto(tmp, CONFIG_FRUITORE));
			dati.setIdServizio(parseIDServizio(tmp));
			IDSoggetto erogatore = parseIdSoggetto(tmp, CONFIG_EROGATORE);
			if(erogatore!=null) {
				if(dati.getIdServizio()!=null) {
					dati.setIdServizio(IDServizioFactory.getInstance().getIDServizioFromValuesWithoutCheck(
							dati.getIdServizio().getTipo(), 
							dati.getIdServizio().getNome(), 
							erogatore.getTipo(), 
							erogatore.getNome(), 
							dati.getIdServizio().getVersione()));
				}
				else {
					dati.setIdServizio(IDServizioFactory.getInstance().getIDServizioFromValuesWithoutCheck(
							null, 
							null, 
							erogatore.getTipo(), 
							erogatore.getNome(), 
							-1));
				}
			}
			dati.setGruppo(parse(tmp, CONFIG_GRUPPO));
			dati.setConnettore(parse(tmp, CONFIG_CONNETTORE));
			
			dati.setTokenPolicyNegoziazione(parse(tmp, CONFIG_POLICY_NEGOZIAZIONE));
			
			dati.setTokenPolicyValidazioneDynamicDiscovery(parse(tmp, CONFIG_POLICY_VALIDAZIONE_DYNAMIC_DISCOVERY));
			dati.setTokenPolicyValidazioneJwt(parse(tmp, CONFIG_POLICY_VALIDAZIONE_JWT));
			dati.setTokenPolicyValidazioneIntrospection(parse(tmp, CONFIG_POLICY_VALIDAZIONE_INTROSPECTION));
			dati.setTokenPolicyValidazioneUserInfo(parse(tmp, CONFIG_POLICY_VALIDAZIONE_USER_INFO));
			
			dati.setAttributeAuthority(parse(tmp, CONFIG_ATTRIBUTE_AUTHORITY));
			dati.setAttributeAuthorityResponseJwt(parse(tmp, CONFIG_ATTRIBUTE_AUTHORITY_VALIDAZIONE_RISPOSTA_JWT));
			
			dati.setNomePorta(parse(tmp, CONFIG_NOME_PORTA_INBOUND_PROPERTY));
			if(dati.getNomePorta()==null) {
				dati.setNomePorta(parse(tmp, CONFIG_NOME_PORTA_OUTBOUND_PROPERTY));
			}
			if(dati.getNomePorta()==null) {
				dati.setNomePorta(parse(tmp, CONFIG_NOME_PORTA_PROPERTY));
			}
		}
		return dati;
	}
	private static String parse(String [] tmp, String prefix) {
		for (String s : tmp) {
			if(s!=null) {
				s = s.trim();
				if(s.startsWith(prefix) && s.length()>prefix.length()) {
					return s.substring(prefix.length(),s.length());
				}
			}
		}
		return null;
	}
	private static RuoloPolicy parseRuoloPolicy(String [] tmp, String prefix) {
		String v = parse(tmp, prefix);
		if(CONFIG_TIPOLOGIA_VALUE_APPLICATIVA.equals(v)) {
			return RuoloPolicy.APPLICATIVA;
		}
		else if(CONFIG_TIPOLOGIA_VALUE_DELEGATA.equals(v)) {
			return RuoloPolicy.DELEGATA;
		}
		return null;
	}
	private static IDSoggetto parseIdSoggetto(String [] tmp, String prefix) throws IDException {
		String v = parse(tmp, prefix);
		if(v!=null) {
			return IDSoggetto.toIDSoggetto(v);
		}
		return null;
	}
	private static IDServizio parseIDServizio(String [] tmp) throws IDException {
		String v = parse(tmp, CONFIG_SERVIZIO);
		if(v!=null) {
			return parseIDServizio(v);
		}
		return null;
	}
	private static IDServizio parseIDServizio(String formatString) throws IDException {
		String [] tmp = formatString.split("/");
		if(tmp.length!=3) {
			throw new IDException("Formato '"+formatString+"' non supportato, attesi 3 valori, trovati "+tmp.length);
		}
		String tipo = tmp[0];
		String nome = tmp[1];
		String versioneS = tmp[2];
		int versione = Integer.parseInt(versioneS);
		return IDServizioFactory.getInstance().getIDServizioFromValuesWithoutCheck(tipo, nome, null, null, versione);
	}
	
	public static List<String> buildConfigurazioneEventoAsList(PolicyDati dati, Integer sogliaMs, Boolean globale) {
		List<String> l = new ArrayList<>();
		if(globale!=null) {
			/** l.add(PolicyUtilities.GLOBALE_PROPERTY+globale); Lasciandolo in prima posizione non verrĂ  serializzato su DB, ma verrĂ  fornito solo all'interfaccia di notifica passiva */
			l.add(CONFIG_GLOBALE_PROPERTY+globale);
		}
		if(sogliaMs!=null) {
			l.add(CONFIG_TIMEOUT+sogliaMs);
		}
		if(dati!=null) {
			addConfigurazioneEventoAsList(dati, l);
		}
		return l;
	}
	private static void addConfigurazioneEventoAsList(PolicyDati dati, List<String> l) {
		if(dati.getProfilo()!=null) {
			l.add(CONFIG_PROFILO+dati.getProfilo());
		}
		addConfigurazioneEventoRuoloPorta(dati, l);
		if(dati.getIdFruitore()!=null) {
			l.add(CONFIG_FRUITORE+dati.getIdFruitore().toFormatString());
		}
		if(dati.getIdServizio()!=null) {
			if(dati.getIdServizio().getSoggettoErogatore()!=null &&
					dati.getIdServizio().getSoggettoErogatore().getTipo()!=null &&
					dati.getIdServizio().getSoggettoErogatore().getNome()!=null) {
				l.add(CONFIG_EROGATORE+dati.getIdServizio().getSoggettoErogatore().toFormatString());
			}
			if(dati.getIdServizio().getNome()!=null && dati.getIdServizio().getTipo()!=null && dati.getIdServizio().getVersione()!=null) {
				l.add(CONFIG_SERVIZIO+toFormatStringIDServizio(dati.getIdServizio()));
			}
		}
		if(dati.getGruppo()!=null) {
			l.add(CONFIG_GRUPPO+dati.getGruppo());
		}
		if(dati.getConnettore()!=null) {
			l.add(CONFIG_CONNETTORE+dati.getConnettore());
		}
		if(dati.getTokenPolicyNegoziazione()!=null) {
			l.add(CONFIG_POLICY_NEGOZIAZIONE+dati.getTokenPolicyNegoziazione());
		}
		if(dati.getTokenPolicyValidazioneDynamicDiscovery()!=null) {
			l.add(CONFIG_POLICY_VALIDAZIONE_DYNAMIC_DISCOVERY+dati.getTokenPolicyValidazioneDynamicDiscovery());
		}
		if(dati.getTokenPolicyValidazioneJwt()!=null) {
			l.add(CONFIG_POLICY_VALIDAZIONE_JWT+dati.getTokenPolicyValidazioneJwt());
		}
		if(dati.getTokenPolicyValidazioneIntrospection()!=null) {
			l.add(CONFIG_POLICY_VALIDAZIONE_INTROSPECTION+dati.getTokenPolicyValidazioneIntrospection());
		}
		if(dati.getTokenPolicyValidazioneUserInfo()!=null) {
			l.add(CONFIG_POLICY_VALIDAZIONE_USER_INFO+dati.getTokenPolicyValidazioneUserInfo());
		}
		if(dati.getAttributeAuthority()!=null) {
			l.add(CONFIG_ATTRIBUTE_AUTHORITY+dati.getAttributeAuthority());
		}
		if(dati.getAttributeAuthorityResponseJwt()!=null) {
			l.add(CONFIG_ATTRIBUTE_AUTHORITY_VALIDAZIONE_RISPOSTA_JWT+dati.getAttributeAuthorityResponseJwt());
		}
		addConfigurazioneEventoNomePorta(dati, l);
	}
	private static String toFormatStringIDServizio(IDServizio idServizio){
		StringBuilder sb = new StringBuilder();
		sb.append(idServizio.getTipo());
		sb.append("/");
		sb.append(idServizio.getNome());
		sb.append("/");
		sb.append(idServizio.getVersione());
		return sb.toString();
	}
	private static void addConfigurazioneEventoRuoloPorta(PolicyDati dati, List<String> l) {
		if(dati.getRuoloPorta()!=null) {
			switch (dati.getRuoloPorta()) {
			case DELEGATA:
				l.add(CONFIG_TIPOLOGIA+CONFIG_TIPOLOGIA_VALUE_DELEGATA);
				break;
			case APPLICATIVA:
				l.add(CONFIG_TIPOLOGIA+CONFIG_TIPOLOGIA_VALUE_APPLICATIVA);
				break;
			default:
				break;
			}
		}
	}
	private static void addConfigurazioneEventoNomePorta(PolicyDati dati, List<String> l) {
		if(dati.getNomePorta()!=null) {
			if(dati.getRuoloPorta()!=null) {
				switch (dati.getRuoloPorta()) {
				case DELEGATA:
					l.add(CONFIG_NOME_PORTA_OUTBOUND_PROPERTY+dati.getNomePorta());
					break;
				case APPLICATIVA:
					l.add(CONFIG_NOME_PORTA_INBOUND_PROPERTY+dati.getNomePorta());
					break;
				default:
					l.add(CONFIG_NOME_PORTA_PROPERTY+dati.getNomePorta());
					break;
				}
			}
			else {
				l.add(CONFIG_NOME_PORTA_PROPERTY+dati.getNomePorta());
			}
		}
	}
	
	private static String buildConfigurazioneEvento(PolicyDati dati, int sogliaMs, boolean globale) {
		
		List<String> l = buildConfigurazioneEventoAsList(dati, sogliaMs, globale);
		StringBuilder sb = new StringBuilder();
		if(!l.isEmpty()) {
			for (String v : l) {
				if(sb.length()>0) {
					sb.append("\n");
				}
				sb.append(v);
			}
		}
		return sb.toString();
		
	}
	
	public static SogliaReadTimeout buildSogliaRequestTimeout(int sogliaMs, boolean delegata, IProtocolFactory<?> protocolFactory) {
		return buildSogliaTimeout(sogliaMs, delegata, protocolFactory);
	}
	public static SogliaReadTimeout buildSogliaResponseTimeout(int sogliaMs, boolean delegata, IProtocolFactory<?> protocolFactory) {
		return buildSogliaTimeout(sogliaMs, delegata, protocolFactory);
	}
	private static SogliaReadTimeout buildSogliaTimeout(int sogliaMs, boolean delegata, IProtocolFactory<?> protocolFactory) {
		SogliaReadTimeout soglia = new SogliaReadTimeout();
		soglia.setConfigurazioneGlobale(true);
		soglia.setSogliaMs(sogliaMs);
				
		String api = "APINonIndividuata";
		soglia.setIdConfigurazione(api);
		
		PolicyDati dati = new PolicyDati();
		if(protocolFactory!=null) {
			dati.setProfilo(protocolFactory.getProtocol());
		}
		dati.setRuoloPorta(delegata ? RuoloPolicy.DELEGATA : RuoloPolicy.APPLICATIVA);
		
		soglia.setConfigurazione(buildConfigurazioneEvento(dati, sogliaMs, true));
				
		return soglia;
	}
	
	public static SogliaReadTimeout buildSogliaRequestTimeout(int sogliaMs, boolean configurazioneGlobale, PortaDelegata pd, 
			ReadTimeoutContextParam readTimeoutContextParam) throws DriverConfigurazioneException, ProtocolException {
		return buildSogliaTimeout(sogliaMs, configurazioneGlobale, pd.getNome(), RuoloPolicy.DELEGATA, null, null,
				readTimeoutContextParam);
	}
	public static SogliaReadTimeout buildSogliaRequestTimeout(int sogliaMs, boolean configurazioneGlobale, PortaApplicativa pa, 
			ReadTimeoutContextParam readTimeoutContextParam) throws DriverConfigurazioneException, ProtocolException {
		return buildSogliaTimeout(sogliaMs, configurazioneGlobale, pa.getNome(), RuoloPolicy.APPLICATIVA, null, null,
				readTimeoutContextParam);
	}
	
	public static SogliaReadTimeout buildSogliaResponseTimeout(int sogliaMs, boolean configurazioneGlobale, PortaDelegata pd, PolicyTimeoutConfig policyConfig, 
			ReadTimeoutContextParam readTimeoutContextParam) throws DriverConfigurazioneException, ProtocolException {
		return buildSogliaTimeout(sogliaMs, configurazioneGlobale, pd.getNome(), RuoloPolicy.DELEGATA, null, policyConfig,
				readTimeoutContextParam);
	}
	public static SogliaReadTimeout buildSogliaResponseTimeout(int sogliaMs, boolean configurazioneGlobale, PortaApplicativa pa, String nomeConnettoreAsincrono, PolicyTimeoutConfig policyConfig, 
			ReadTimeoutContextParam readTimeoutContextParam) throws DriverConfigurazioneException, ProtocolException {
		return buildSogliaTimeout(sogliaMs, configurazioneGlobale, pa.getNome(), RuoloPolicy.APPLICATIVA, nomeConnettoreAsincrono, policyConfig,
				readTimeoutContextParam);
	}
	
	private static SogliaReadTimeout buildSogliaTimeout(int sogliaMs, boolean configurazioneGlobale, String nomePorta, RuoloPolicy ruoloPorta, String nomeConnettoreAsincrono, PolicyTimeoutConfig policyConfig, 
			ReadTimeoutContextParam readTimeoutContextParam) throws DriverConfigurazioneException, ProtocolException {
		
		SogliaReadTimeout soglia = new SogliaReadTimeout();
		soglia.setSogliaMs(sogliaMs);
		
		soglia.setConfigurazioneGlobale(configurazioneGlobale);
		
		PolicyDati dati = readConfigurazione(nomePorta, ruoloPorta, nomeConnettoreAsincrono, policyConfig, readTimeoutContextParam);
		
		soglia.setIdConfigurazione(dati.getIdentificativo());
		
		soglia.setConfigurazione(buildConfigurazioneEvento(dati, sogliaMs, configurazioneGlobale));
				
		return soglia;
	}
	
	private static PolicyDati readConfigurazione(String nomePorta, RuoloPolicy ruoloPorta, String nomeConnettoreAsincrono, PolicyTimeoutConfig policyConfig, ReadTimeoutContextParam readTimeoutContextParam) throws DriverConfigurazioneException, ProtocolException {
		
		ConfigurazionePdDManager configPdDManager = ConfigurazionePdDManager.getInstance(readTimeoutContextParam.getState());
		
		StringBuilder sb = new StringBuilder();
		
		PolicyDati dati = RuoloPolicy.DELEGATA.equals(ruoloPorta) ?
				PolicyVerifier.getIdAPIFruizione(nomePorta, configPdDManager, readTimeoutContextParam.getRequestInfo(), readTimeoutContextParam.getProtocolFactory())
				:
				PolicyVerifier.getIdAPIErogazione(nomePorta, configPdDManager, readTimeoutContextParam.getRequestInfo(), readTimeoutContextParam.getProtocolFactory());
		String api = dati.getIdentificativo();
		if(api!=null) {
			api = api.trim();
		}
		sb.append(api);
		
		if(RuoloPolicy.APPLICATIVA.equals(ruoloPorta)) {
			if(nomeConnettoreAsincrono!=null) {
				sb.append(" (connettore '").append(nomeConnettoreAsincrono).append("')");
				dati.setConnettore(nomeConnettoreAsincrono);
			}
			else {
				String connettoriMultipli = ConnettoreUtils.getNomeConnettori(readTimeoutContextParam.getContext());
				if(connettoriMultipli!=null) {
					sb.append(" (connettore '").append(connettoriMultipli).append("')");
					dati.setConnettore(connettoriMultipli);
				}
			}
		}
		
		addPolicyInfo(sb, policyConfig, dati);
		
		dati.setIdentificativo(sb.toString()); // aggiorno
		
		return dati;
	}
	
	public static void addPolicyInfo(StringBuilder sb, PolicyTimeoutConfig policyConfig) {
		addPolicyInfo(sb, policyConfig, null);
	}
	public static void addPolicyInfo(StringBuilder sb, PolicyTimeoutConfig policyConfig, PolicyDati policyDati) {
		
		addPolicyInfoTokenPolicyNegoziazione(sb, policyConfig, policyDati);
		
		addPolicyInfoTokenPolicyValidazione(sb, policyConfig, policyDati);
		
		addPolicyInfoAttributeAuthority(sb, policyConfig, policyDati);
	}
	
	private static void addPolicyInfoTokenPolicyNegoziazione(StringBuilder sb, PolicyTimeoutConfig policyConfig, PolicyDati policyDati) {
		if(policyConfig!=null && policyConfig.getPolicyNegoziazione()!=null) {
			sb.append(" (").append(ID_POLICY_NEGOZIAZIONE).append(" '").append(policyConfig.getPolicyNegoziazione()).append("')");
			if(policyDati!=null) {
				policyDati.setTokenPolicyNegoziazione(policyConfig.getPolicyNegoziazione());
			}
		}
	}
	private static void addPolicyInfoTokenPolicyValidazione(StringBuilder sb, PolicyTimeoutConfig policyConfig, PolicyDati policyDati) {
		addPolicyInfoTokenPolicyValidazioneDynamicDiscovery(sb, policyConfig, policyDati);
		addPolicyInfoTokenPolicyValidazioneJwt(sb, policyConfig, policyDati);
		addPolicyInfoTokenPolicyValidazioneIntrospection(sb, policyConfig, policyDati);
		addPolicyInfoTokenPolicyValidazioneUserInfo(sb, policyConfig, policyDati);
	}
	private static void addPolicyInfoTokenPolicyValidazioneDynamicDiscovery(StringBuilder sb, PolicyTimeoutConfig policyConfig, PolicyDati policyDati) {
		if(policyConfig!=null && policyConfig.getPolicyValidazioneDynamicDiscovery()!=null) {
			sb.append(" (").append(ID_POLICY_VALIDAZIONE_DYNAMIC_DISCOVERY).append(" '").append(policyConfig.getPolicyValidazioneDynamicDiscovery()).append("')");
			if(policyDati!=null) {
				policyDati.setTokenPolicyValidazioneDynamicDiscovery(policyConfig.getPolicyValidazioneDynamicDiscovery());
			}
		}
	}
	private static void addPolicyInfoTokenPolicyValidazioneJwt(StringBuilder sb, PolicyTimeoutConfig policyConfig, PolicyDati policyDati) {
		if(policyConfig!=null && policyConfig.getPolicyValidazioneJwt()!=null) {
			sb.append(" (").append(ID_POLICY_VALIDAZIONE_JWT).append(" '").append(policyConfig.getPolicyValidazioneJwt()).append("')");
			if(policyDati!=null) {
				policyDati.setTokenPolicyValidazioneJwt(policyConfig.getPolicyValidazioneJwt());
			}
		}
	}
	private static void addPolicyInfoTokenPolicyValidazioneIntrospection(StringBuilder sb, PolicyTimeoutConfig policyConfig, PolicyDati policyDati) {
		if(policyConfig!=null && policyConfig.getPolicyValidazioneIntrospection()!=null) {
			sb.append(" (").append(ID_POLICY_VALIDAZIONE_INTROSPECTION).append(" '").append(policyConfig.getPolicyValidazioneIntrospection()).append("')");
			if(policyDati!=null) {
				policyDati.setTokenPolicyValidazioneIntrospection(policyConfig.getPolicyValidazioneIntrospection());
			}
		}
	}
	private static void addPolicyInfoTokenPolicyValidazioneUserInfo(StringBuilder sb, PolicyTimeoutConfig policyConfig, PolicyDati policyDati) {
		if(policyConfig!=null && policyConfig.getPolicyValidazioneUserInfo()!=null) {
			sb.append(" (").append(ID_POLICY_VALIDAZIONE_USER_INFO).append(" '").append(policyConfig.getPolicyValidazioneUserInfo()).append("')");
			if(policyDati!=null) {
				policyDati.setTokenPolicyValidazioneUserInfo(policyConfig.getPolicyValidazioneUserInfo());
			}
		}
	}
	private static void addPolicyInfoAttributeAuthority(StringBuilder sb, PolicyTimeoutConfig policyConfig, PolicyDati policyDati) {
		addPolicyInfoAttributeAuthorityEndpoint(sb, policyConfig, policyDati);
		addPolicyInfoAttributeAuthorityValidazioneJwtResponse(sb, policyConfig, policyDati);
	}
	private static void addPolicyInfoAttributeAuthorityEndpoint(StringBuilder sb, PolicyTimeoutConfig policyConfig, PolicyDati policyDati) {
		if(policyConfig!=null && policyConfig.getAttributeAuthority()!=null) {
			sb.append(" (").append(ID_ATTRIBUTE_AUTHORITY).append(" '").append(policyConfig.getAttributeAuthority()).append("')");
			if(policyDati!=null) {
				policyDati.setAttributeAuthority(policyConfig.getAttributeAuthority());
			}
		}
	}
	private static void addPolicyInfoAttributeAuthorityValidazioneJwtResponse(StringBuilder sb, PolicyTimeoutConfig policyConfig, PolicyDati policyDati) {
		if(policyConfig!=null && policyConfig.getAttributeAuthorityResponseJwt()!=null) {
			sb.append(" (").append(ID_ATTRIBUTE_AUTHORITY_VALIDAZIONE_RISPOSTA_JWT).append(" '").append(policyConfig.getAttributeAuthorityResponseJwt()).append("')");
			if(policyDati!=null) {
				policyDati.setAttributeAuthorityResponseJwt(policyConfig.getAttributeAuthorityResponseJwt());
			}
		}
	}
	
}