ConnettoreUtils.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.connettori;

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

import org.apache.commons.lang.StringUtils;
import org.openspcoop2.core.config.GenericProperties;
import org.openspcoop2.core.config.InvocazioneCredenziali;
import org.openspcoop2.core.config.InvocazioneServizio;
import org.openspcoop2.core.config.ServizioApplicativo;
import org.openspcoop2.core.config.constants.CostantiConfigurazione;
import org.openspcoop2.core.config.constants.StatoFunzionalita;
import org.openspcoop2.core.constants.CostantiConnettori;
import org.openspcoop2.core.constants.CostantiLabel;
import org.openspcoop2.core.constants.TipiConnettore;
import org.openspcoop2.message.OpenSPCoop2Message;
import org.openspcoop2.message.OpenSPCoop2MessageProperties;
import org.openspcoop2.message.constants.ServiceBinding;
import org.openspcoop2.message.rest.RestUtilities;
import org.openspcoop2.pdd.config.ForwardProxy;
import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
import org.openspcoop2.pdd.core.CostantiPdD;
import org.openspcoop2.pdd.core.PdDContext;
import org.openspcoop2.pdd.core.dynamic.DynamicUtils;
import org.openspcoop2.pdd.core.token.PolicyNegoziazioneToken;
import org.openspcoop2.pdd.core.token.TokenUtilities;
import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
import org.openspcoop2.pdd.mdb.ConsegnaContenutiApplicativi;
import org.openspcoop2.protocol.sdk.Busta;
import org.openspcoop2.protocol.sdk.Context;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.utils.PorteNamingUtils;
import org.openspcoop2.utils.Utilities;
import org.openspcoop2.utils.certificate.byok.BYOKManager;
import org.openspcoop2.utils.certificate.hsm.HSMUtils;
import org.openspcoop2.utils.certificate.ocsp.OCSPManager;
import org.openspcoop2.utils.transport.TransportUtils;
import org.openspcoop2.utils.transport.http.HttpRequestMethod;
import org.slf4j.Logger;


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

	public static String formatLocation(HttpRequestMethod httpMethod, String location){
		if(httpMethod!=null)
			return location+" http-method:"+httpMethod;
		else
			return location;
	}
	
	public static String getAndReplaceLocationWithBustaValues(IConnettore connector, ConnettoreMsg connettoreMsg,Busta busta,PdDContext pddContext,IProtocolFactory<?> protocolFactory,Logger log) throws ConnettoreException{
		
		boolean dynamicLocation = false;
		
		String location = null;
		if(TipiConnettore.NULL.getNome().equals(connettoreMsg.getTipoConnettore())){
			location = ConnettoreNULL.LOCATION;
		}
		else if(TipiConnettore.NULLECHO.getNome().equals(connettoreMsg.getTipoConnettore())){
			location = ConnettoreNULLEcho.LOCATION;
		}
		else if(TipiConnettore.STATUS.getNome().equals(connettoreMsg.getTipoConnettore())){
			location = ConnettoreStatus.LOCATION;
		}
		else if(ConnettoreStresstest.ENDPOINT_TYPE.equals(connettoreMsg.getTipoConnettore())){
			location = ConnettoreStresstest.LOCATION;
		}
		else if(TipiConnettore.FILE.getNome().equals(connettoreMsg.getTipoConnettore())){
			try{
				location = ((ConnettoreFILE)connector).buildLocation(connettoreMsg);
				//dynamicLocation = true; la dinamicita viene gia gestita nel metodo buildLocation
			}catch(Exception e){
				log.error("Errore durante la costruzione della location: "+e.getMessage(),e);
				location = "N.D.";
			}
		}
		else if(ConnettoreRicezioneBusteDirectVM.TIPO.equals(connettoreMsg.getTipoConnettore())){
			try{
				((ConnettoreRicezioneBusteDirectVM)connector).validate(connettoreMsg);
				((ConnettoreRicezioneBusteDirectVM)connector).buildLocation(connettoreMsg.getConnectorProperties(),false);
				location = connector.getLocation();
				dynamicLocation = true;
			}catch(Exception e){
				log.error("Errore durante la costruzione della location: "+e.getMessage(),e);
				location = "N.D.";
			}
		}
		else if(ConnettoreRicezioneContenutiApplicativiDirectVM.TIPO.equals(connettoreMsg.getTipoConnettore())){
			try{
				((ConnettoreRicezioneContenutiApplicativiDirectVM)connector).validate(connettoreMsg);
				((ConnettoreRicezioneContenutiApplicativiDirectVM)connector).buildLocation(connettoreMsg.getConnectorProperties(),false);
				location = connector.getLocation();
				dynamicLocation = true;
			}catch(Exception e){
				log.error("Errore durante la costruzione della location: "+e.getMessage(),e);
				location = "N.D.";
			}
		}
		else if(ConnettoreRicezioneContenutiApplicativiHTTPtoSOAPDirectVM.TIPO.equals(connettoreMsg.getTipoConnettore())){
			try{
				((ConnettoreRicezioneContenutiApplicativiHTTPtoSOAPDirectVM)connector).validate(connettoreMsg);
				((ConnettoreRicezioneContenutiApplicativiHTTPtoSOAPDirectVM)connector).buildLocation(connettoreMsg.getConnectorProperties(),false);
				location = connector.getLocation();
				dynamicLocation = true;
			}catch(Exception e){
				log.error("Errore durante la costruzione della location: "+e.getMessage(),e);
				location = "N.D.";
			}
		}
		else{
			if(connettoreMsg.getConnectorProperties().get(CostantiConnettori.CONNETTORE_LOCATION)!=null){
				location = connettoreMsg.getConnectorProperties().get(CostantiConnettori.CONNETTORE_LOCATION);
				dynamicLocation = true; // http, jms, ...
			}
		}
		
		if(location !=null && (location.equals("")==false) ){
			
			// Keyword old
			location = location.replace(CostantiConnettori.CONNETTORE_JMS_LOCATION_REPLACE_TOKEN_TIPO_SERVIZIO,busta.getTipoServizio());
			location = location.replace(CostantiConnettori.CONNETTORE_JMS_LOCATION_REPLACE_TOKEN_NOME_SERVIZIO,busta.getServizio());
			if(busta.getAzione()!=null){
				location = location.replace(CostantiConnettori.CONNETTORE_JMS_LOCATION_REPLACE_TOKEN_AZIONE,busta.getAzione());
			}
			
			// Dynamic
			// Costruisco Mappa per dynamic name
			if(dynamicLocation) {
				try {
					Map<String, Object> dynamicMap = ((ConnettoreBase)connector).buildDynamicMap(connettoreMsg);
					location = DynamicUtils.convertDynamicPropertyValue(CostantiConnettori.CONNETTORE_LOCATION, location, dynamicMap, pddContext, false);
				}catch(Exception e){
					log.error("Errore durante la costruzione della location (dynamic): "+e.getMessage(),e);
				}
			}
			
			connettoreMsg.getConnectorProperties().put(CostantiConnettori.CONNETTORE_LOCATION,location);
		}
		
		return location;
	}
	
	public static String buildLocationWithURLBasedParameter(Logger log, OpenSPCoop2Message msg, String tipoConnettore, Map<String, List<String>> propertiesURLBased, String locationParam,
			IProtocolFactory<?> protocolFactory, String idModulo) throws ConnettoreException{
		
		if(TipiConnettore.HTTP.toString().equals(tipoConnettore) || 
				TipiConnettore.HTTPS.toString().equals(tipoConnettore) ||
				ConnettoreHTTPCORE.ENDPOINT_TYPE.equals(tipoConnettore) ||
				ConnettoreSAAJ.ENDPOINT_TYPE.equals(tipoConnettore)  ||
				ConnettoreStresstest.ENDPOINT_TYPE.equals(tipoConnettore)){
	
			try{
			
				OpenSPCoop2MessageProperties forwardParameter = null;
				if(ServiceBinding.REST.equals(msg.getServiceBinding())) {
					forwardParameter = msg.getForwardUrlProperties(OpenSPCoop2Properties.getInstance().getRESTServicesUrlParametersForwardConfig());
				}
				else {
					forwardParameter = msg.getForwardUrlProperties(OpenSPCoop2Properties.getInstance().getSOAPServicesUrlParametersForwardConfig());
				}
				
				Map<String, List<String>>  p = propertiesURLBased;
				if(forwardParameter!=null && forwardParameter.size()>0){
					if(p==null){
						p = new HashMap<> ();
					}
					Iterator<String> keys = forwardParameter.getKeys();
					while (keys.hasNext()) {
						String key = (String) keys.next();
						List<String> values = forwardParameter.getPropertyValues(key);
						if(values!=null && !values.isEmpty()){
							if(p.containsKey(key)){
								p.remove(key);
							}
							p.put(key, values);
						}
					}
				}
				
				String location = locationParam;
				if(ServiceBinding.REST.equals(msg.getServiceBinding())){
					
					String normalizedInterfaceName = normalizeInterfaceName(msg, idModulo, protocolFactory);
					
					return RestUtilities.buildUrl(log, location, p, msg.getTransportRequestContext(),
							normalizedInterfaceName);
				}
				else{
					boolean encodeBaseLocation = true; // la base location può contenere dei parametri
					return TransportUtils.buildUrlWithParameters(p, location, encodeBaseLocation, OpenSPCoop2Logger.getLoggerOpenSPCoopCore());
				}
				
			}catch(Exception e){
				throw new ConnettoreException(e.getMessage(),e);
			}
		}
		return locationParam;
	}

	public static String normalizeInterfaceName(OpenSPCoop2Message msg, String idModulo, IProtocolFactory<?> protocolFactory) throws ProtocolException {
		Object nomePortaInvocataObject = msg.getContextProperty(CostantiPdD.NOME_PORTA_INVOCATA);
		String nomePortaInvocata = null;
		if(nomePortaInvocataObject!=null && nomePortaInvocataObject instanceof String) {
			nomePortaInvocata = (String) nomePortaInvocataObject;
		}
		else if(msg.getTransportRequestContext()!=null && msg.getTransportRequestContext().getInterfaceName()!=null) {
			nomePortaInvocata = msg.getTransportRequestContext().getInterfaceName();
		}
		
		String normalizedInterfaceName = null;
		if(nomePortaInvocata!=null) {
			PorteNamingUtils namingUtils = new PorteNamingUtils(protocolFactory);
			if(ConsegnaContenutiApplicativi.ID_MODULO.equals(idModulo)){
				normalizedInterfaceName = namingUtils.normalizePA(nomePortaInvocata);
			}
			else {
				normalizedInterfaceName = namingUtils.normalizePD(nomePortaInvocata);
			}
		}
		
		return normalizedInterfaceName;
	}
	
	public static String limitLocation255Character(String location){
		return TransportUtils.limitLocation255Character(location);
	}
	
	public static String addProxyInfoToLocationForHTTPConnector(String tipoConnettore, Map<String, String> properties, String location){
		if(TipiConnettore.HTTP.toString().equals(tipoConnettore) || 
				TipiConnettore.HTTPS.toString().equals(tipoConnettore)){
			if(properties.get(CostantiConnettori.CONNETTORE_HTTP_PROXY_TYPE)!=null){
				String proxyHostname = properties.get(CostantiConnettori.CONNETTORE_HTTP_PROXY_HOSTNAME);
				String proxyPort = properties.get(CostantiConnettori.CONNETTORE_HTTP_PROXY_PORT);
				return location+" [proxy: "+proxyHostname+":"+proxyPort+"]";
			}
		}
		return location;
	}
	
	public static String addGovWayProxyInfoToLocationForHTTPConnector(ForwardProxy forwardProxy, IConnettore connectorSender, String location) throws ConnettoreException {
		if(forwardProxy!=null && connectorSender instanceof ConnettoreBaseHTTP) {
			ConnettoreBaseHTTP http = (ConnettoreBaseHTTP) connectorSender;
			http.updateForwardProxy(forwardProxy);
			if(http.updateLocation_forwardProxy(location)) {
				return http.getLocation();
			}
		}
		return location;
	}
	

	public static void printDatiConnettore(org.openspcoop2.core.registry.Connettore connettore, String labelTipoConnettore, String labelNomeConnettore,
			boolean connettoreStatic,
			StringBuilder sb,
			String separator, String newLine,
			boolean printIntestazione) {
		printDatiConnettore(connettore.mappingIntoConnettoreConfigurazione(), labelTipoConnettore, labelNomeConnettore,
				null, connettoreStatic,
				sb,
				separator, newLine,
				printIntestazione);
	}
	public static void printDatiConnettore(org.openspcoop2.core.config.Connettore connettore, String labelTipoConnettore, String labelNomeConnettore,
			ServizioApplicativo sa, 
			boolean connettoreStatic,
			StringBuilder sb,
			String separator, String newLine,
			boolean printIntestazione) {

		if(connettoreStatic) {
			return; // non visualizzo nulla
		}
		
		Boolean integrationManager = null;
		InvocazioneCredenziali invCredenziali = null;
		if(sa!=null) {
			InvocazioneServizio is = sa.getInvocazioneServizio();
			integrationManager = is.getGetMessage()!=null && StatoFunzionalita.ABILITATO.equals(is.getGetMessage());
			invCredenziali = is.getCredenziali();
		}
		
		TipiConnettore tipo = TipiConnettore.toEnumFromName(connettore.getTipo());
		if(tipo==null) {
			tipo = TipiConnettore.CUSTOM;
		}
		
		if(printIntestazione) {
			sb.append(newLine);
			String label = labelNomeConnettore!=null ? " "+labelNomeConnettore : "";
			sb.append("- "+CostantiLabel.LABEL_CONNETTORE+label+" -");
		}
		
		String tipoConnettore = labelTipoConnettore;
		if(TipiConnettore.DISABILITATO.equals(tipo)) {
			if(integrationManager!=null && integrationManager) {
				tipoConnettore = "MessageBox";
			}
		}
		else {
			if(integrationManager!=null && integrationManager) {
				tipoConnettore = tipoConnettore + " + MessageBox";
			}
		}
		sb.append(newLine);
		sb.append(CostantiLabel.LABEL_TIPO_CONNETTORE);
		sb.append(separator);
		sb.append(tipoConnettore);
		
		String labelEndpoint = CostantiLabel.LABEL_CONNETTORE_ENDPOINT;
		String endpoint = null;
		if(TipiConnettore.HTTP.getNome().equals(connettore.getTipo()) || TipiConnettore.HTTPS.getNome().equals(connettore.getTipo())){
			endpoint = getProperty(CostantiConnettori.CONNETTORE_LOCATION, connettore.getPropertyList());
		}
		else if(TipiConnettore.JMS.getNome().equals(connettore.getTipo())){
			String tipoCoda = getProperty(CostantiConnettori.CONNETTORE_JMS_TIPO, connettore.getPropertyList());
			labelEndpoint = CostantiLabel.LABEL_CONNETTORE_JMS_NOME_CODA+" "+tipoCoda;
			endpoint = getProperty(CostantiConnettori.CONNETTORE_LOCATION, connettore.getPropertyList());
		}
		else if(TipiConnettore.FILE.getNome().equals(connettore.getTipo())){
			labelEndpoint = CostantiLabel.LABEL_OUTPUT_FILE;
			endpoint = getProperty(CostantiConnettori.CONNETTORE_FILE_REQUEST_OUTPUT_FILE, connettore.getPropertyList());
		}
		else if(TipiConnettore.NULL.getNome().equals(connettore.getTipo())){
			//endpoint = org.openspcoop2.pdd.core.connettori.ConnettoreNULL.LOCATION;
		}
		else if(TipiConnettore.NULLECHO.getNome().equals(connettore.getTipo())){
			//endpoint = org.openspcoop2.pdd.core.connettori.ConnettoreNULLEcho.LOCATION;
		}
		else if(TipiConnettore.STATUS.getNome().equals(connettore.getTipo())){
			//endpoint = org.openspcoop2.pdd.core.connettori.ConnettoreStatus.LOCATION;
		}
		else {
			String endpointV = getProperty(CostantiConnettori.CONNETTORE_LOCATION, connettore.getPropertyList());
			if(StringUtils.isNotEmpty(endpointV)) {
				endpoint = endpointV;
			}
		}
		if(endpoint!=null) {
			sb.append(newLine);
			sb.append(labelEndpoint);
			sb.append(separator);
			sb.append(endpoint);
		}
		
		if(sa!=null && CostantiConfigurazione.SERVER.equals(sa.getTipo())) {
			sb.append(newLine);
			sb.append(CostantiLabel.LABEL_SERVER);
			sb.append(separator);
			sb.append(sa.getNome());
		}
		
		String connectionTimeout = getProperty(CostantiConnettori.CONNETTORE_CONNECTION_TIMEOUT, connettore.getPropertyList());
		if(connectionTimeout!=null) {
			try {
				long l = Long.valueOf(connectionTimeout);
				if(l>0) {
					sb.append(newLine);
					sb.append(CostantiLabel.LABEL_CONNETTORE_TEMPI_RISPOSTA_CONNECTION_TIMEOUT);
					sb.append(separator);
					sb.append(Utilities.convertSystemTimeIntoStringMillisecondi(l, true, false, " "," ",""));
				}
			}catch(Throwable t) {}
		}
		String readConnectionTimeout = getProperty(CostantiConnettori.CONNETTORE_READ_CONNECTION_TIMEOUT, connettore.getPropertyList());
		if(readConnectionTimeout!=null) {
			try {
				long l = Long.valueOf(readConnectionTimeout);
				if(l>0) {
					sb.append(newLine);
					sb.append(CostantiLabel.LABEL_CONNETTORE_TEMPI_RISPOSTA_READ_TIMEOUT);
					sb.append(separator);
					sb.append(Utilities.convertSystemTimeIntoStringMillisecondi(l, true, false, " "," ",""));
				}
			}catch(Throwable t) {}
		}
		
		if(TipiConnettore.HTTP.getNome().equals(connettore.getTipo()) || TipiConnettore.HTTPS.getNome().equals(connettore.getTipo())){
			
			String token = getProperty(CostantiConnettori.CONNETTORE_TOKEN_POLICY, connettore.getPropertyList());
			if(token!=null) {
				sb.append(newLine);
				sb.append(CostantiLabel.LABEL_VERIFICA_CONNETTORE_DETAILS_TOKEN).append(" - ").append(CostantiLabel.LABEL_CONNETTORE_TOKEN_POLICY);
				sb.append(separator);
				sb.append(token);
			}
			
			String username = null;
			if(invCredenziali!=null){
				username = invCredenziali.getUser();
			}
			else{
				username = getProperty(CostantiConnettori.CONNETTORE_USERNAME, connettore.getPropertyList());
			}
			if(username!=null) {
				sb.append(newLine);
				sb.append(CostantiLabel.LABEL_VERIFICA_CONNETTORE_DETAILS_HTTP).append(" - ").append(CostantiLabel.LABEL_CREDENZIALI_AUTENTICAZIONE_USERNAME);
				sb.append(separator);
				sb.append(username);
			}
			
			String bearerToken = getProperty(CostantiConnettori.CONNETTORE_BEARER_TOKEN, connettore.getPropertyList());
			if(bearerToken!=null) {
				sb.append(newLine);
				sb.append(CostantiLabel.LABEL_VERIFICA_CONNETTORE_DETAILS_BEARER).append(" ").append(CostantiLabel.LABEL_CONNETTORE_BEARER_TOKEN);
				sb.append(separator);
				sb.append(bearerToken);
			}
			
			String apiKey = getProperty(CostantiConnettori.CONNETTORE_APIKEY, connettore.getPropertyList());
			if(apiKey!=null && StringUtils.isNotEmpty(apiKey)){
				
				String apiKeyHeader = getProperty(CostantiConnettori.CONNETTORE_APIKEY_HEADER, connettore.getPropertyList());
				if(apiKeyHeader==null || StringUtils.isEmpty(apiKeyHeader)) {
					apiKeyHeader = CostantiConnettori.DEFAULT_HEADER_API_KEY;
				}
				
				sb.append(newLine);
				sb.append(CostantiLabel.LABEL_VERIFICA_CONNETTORE_DETAILS_API_KEY).append(" '").append(apiKeyHeader).append("'");
				/**sb.append(separator);
				sb.append(apiKey); Informazione sensibile*/
				
				String appId = getProperty(CostantiConnettori.CONNETTORE_APIKEY_APPID, connettore.getPropertyList());
				if(appId!=null && StringUtils.isNotEmpty(appId)){
					
					String appIdHeader = getProperty(CostantiConnettori.CONNETTORE_APIKEY_APPID_HEADER, connettore.getPropertyList());
					if(appIdHeader==null || StringUtils.isEmpty(appIdHeader)) {
						appIdHeader = CostantiConnettori.DEFAULT_HEADER_APP_ID;
					}
					
					sb.append(newLine);
					sb.append(CostantiLabel.LABEL_VERIFICA_CONNETTORE_DETAILS_API_KEY_APP_ID).append(" '").append(appIdHeader).append("'");
					sb.append(separator);
					sb.append(appId);
					
				}
			}
			
		}
		
		if(TipiConnettore.HTTPS.getNome().equals(connettore.getTipo())){
			
			boolean trustAllCerts = false;
			String trustAllCertsV = getProperty(CostantiConnettori.CONNETTORE_HTTPS_TRUST_ALL_CERTS, connettore.getPropertyList());
			if("true".equalsIgnoreCase(trustAllCertsV)) {
				trustAllCerts = true;
			}
			
			String trustLocation = getProperty(CostantiConnettori.CONNETTORE_HTTPS_TRUST_STORE_LOCATION, connettore.getPropertyList());
			
			if(trustAllCerts || trustLocation!=null) {
				
				String sslType = getProperty(CostantiConnettori.CONNETTORE_HTTPS_SSL_TYPE, connettore.getPropertyList());
				if(sslType!=null) {
					sb.append(newLine);
					sb.append(CostantiLabel.LABEL_VERIFICA_CONNETTORE_DETAILS_HTTPS);
					sb.append(separator);
					sb.append(sslType);
				}
				
				String hostnameVerifier = getProperty(CostantiConnettori.CONNETTORE_HTTPS_HOSTNAME_VERIFIER, connettore.getPropertyList());
				if(hostnameVerifier!=null) {
					sb.append(newLine);
					sb.append(CostantiLabel.LABEL_CONNETTORE_HTTPS_HOST_VERIFY);
					sb.append(separator);
					sb.append(hostnameVerifier);
				}
				
				sb.append(newLine);
				sb.append(CostantiLabel.LABEL_VERIFICA_CONNETTORE_DETAILS_HTTPS_TRUSTSTORE);
				sb.append(separator);
				if(trustAllCerts) {
					sb.append(CostantiLabel.LABEL_VERIFICA_CONNETTORE_DETAILS_HTTPS_TRUST_ALL_CERTS);
				}
				else {
					String trustType = getProperty(CostantiConnettori.CONNETTORE_HTTPS_TRUST_STORE_TYPE, connettore.getPropertyList());
					boolean hsm = HSMUtils.isKeystoreHSM(trustType);
					if(hsm) {
						trustLocation = CostantiLabel.CONNETTORE_HSM;
					}
					sb.append("(").append(trustType).append(") ").append(trustLocation);
				}
				
				String trustCRL = getProperty(CostantiConnettori.CONNETTORE_HTTPS_TRUST_STORE_CRLS, connettore.getPropertyList());
				if(trustCRL!=null) {
					sb.append(newLine);
					sb.append(CostantiLabel.LABEL_VERIFICA_CONNETTORE_DETAILS_HTTPS_TRUSTSTORE_CRLS);
					sb.append(separator);
					sb.append(trustCRL);
				}
				
				String trustOCSP = getProperty(CostantiConnettori.CONNETTORE_HTTPS_TRUST_STORE_OCSP_POLICY, connettore.getPropertyList());
				if(trustOCSP!=null) {
					sb.append(newLine);
					sb.append(CostantiLabel.LABEL_VERIFICA_CONNETTORE_DETAILS_HTTPS_TRUSTSTORE_OCSP_POLICY);
					sb.append(separator);
					try {
						String label = OCSPManager.getInstance().getOCSPConfig(trustOCSP).getLabel();
						sb.append((label!=null && StringUtils.isNotEmpty(label)) ? label : trustOCSP);
					}catch(Throwable t) {
						sb.append(trustOCSP);	
					}
				}
			}
			
			String keyLocation = getProperty(CostantiConnettori.CONNETTORE_HTTPS_KEY_STORE_LOCATION, connettore.getPropertyList());
			if(keyLocation!=null) {
				
				sb.append(newLine);
				sb.append(CostantiLabel.LABEL_VERIFICA_CONNETTORE_DETAILS_HTTPS_KEYSTORE);
				sb.append(separator);
				
				String keyType = getProperty(CostantiConnettori.CONNETTORE_HTTPS_KEY_STORE_TYPE, connettore.getPropertyList());
				boolean hsm = HSMUtils.isKeystoreHSM(keyType);
				if(hsm) {
					keyLocation = CostantiLabel.CONNETTORE_HSM;
				}
				sb.append("(").append(keyType).append(") ").append(keyLocation);
				
				String keyAlias = getProperty(CostantiConnettori.CONNETTORE_HTTPS_KEY_ALIAS, connettore.getPropertyList());
				if(keyAlias!=null) {
					sb.append(newLine);
					sb.append(CostantiLabel.LABEL_VERIFICA_CONNETTORE_DETAILS_HTTPS_KEY_ALIAS);
					sb.append(separator);
					sb.append(keyAlias);
				}
				
				String keyBYOK = getProperty(CostantiConnettori.CONNETTORE_HTTPS_KEY_STORE_BYOK_POLICY, connettore.getPropertyList());
				if(keyBYOK!=null) {
					sb.append(newLine);
					sb.append(CostantiLabel.LABEL_VERIFICA_CONNETTORE_DETAILS_HTTPS_KEYSTORE_BYOK_POLICY);
					sb.append(separator);
					try {
						String label = BYOKManager.getInstance().getKSMConfigByType(keyBYOK).getLabel();
						sb.append((label!=null && StringUtils.isNotEmpty(label)) ? label : keyBYOK);
					}catch(Exception t) {
						sb.append(keyBYOK);	
					}
				}
			}
		}
		
		if(TipiConnettore.HTTP.getNome().equals(connettore.getTipo()) || TipiConnettore.HTTPS.getNome().equals(connettore.getTipo())){
			String proxyHostname = getProperty(CostantiConnettori.CONNETTORE_HTTP_PROXY_HOSTNAME, connettore.getPropertyList());
			if(proxyHostname!=null) {
				sb.append(newLine);
				sb.append(CostantiLabel.LABEL_VERIFICA_CONNETTORE_DETAILS_PROXY);
				sb.append(separator);
				String proxyPort = getProperty(CostantiConnettori.CONNETTORE_HTTP_PROXY_PORT, connettore.getPropertyList());
				if(proxyPort!=null) {
					sb.append(proxyHostname).append(":").append(proxyPort);
				}
			}
		}
		
		if(TipiConnettore.JMS.getNome().equals(connettore.getTipo())){
			 
			String username = null;
			if(invCredenziali!=null){
				username = invCredenziali.getUser();
			}
			else{
				username = getProperty(CostantiConnettori.CONNETTORE_USERNAME, connettore.getPropertyList());
			}
			if(username!=null) {
				sb.append(newLine);
				sb.append(CostantiLabel.LABEL_CONNETTORE_JMS_USERNAME);
				sb.append(separator);
				sb.append(username);
			}
			
		}

		if(TipiConnettore.FILE.getNome().equals(connettore.getTipo())){
			
			String f = getProperty(CostantiConnettori.CONNETTORE_FILE_REQUEST_OUTPUT_FILE_HEADERS, connettore.getPropertyList());
			if(f!=null) {
				sb.append(newLine);
				sb.append(CostantiLabel.LABEL_OUTPUT_FILE_HEADER);
				sb.append(separator);
				sb.append(f);
			}
			
			f = getProperty(CostantiConnettori.CONNETTORE_FILE_RESPONSE_INPUT_FILE, connettore.getPropertyList());
			if(f!=null) {
				sb.append(newLine);
				sb.append(CostantiLabel.LABEL_INPUT_FILE);
				sb.append(separator);
				sb.append(f);
			}
			
			f = getProperty(CostantiConnettori.CONNETTORE_FILE_RESPONSE_INPUT_FILE_HEADERS, connettore.getPropertyList());
			if(f!=null) {
				sb.append(newLine);
				sb.append(CostantiLabel.LABEL_INPUT_FILE_HEADER);
				sb.append(separator);
				sb.append(f);
			}
		}
		
	}
	
	public static String getEndpointConnettore(org.openspcoop2.core.registry.Connettore connettore, boolean connettoreStatic) {
		return getEndpointConnettore(connettore.mappingIntoConnettoreConfigurazione(), connettoreStatic);
	}
	public static String getEndpointConnettore(org.openspcoop2.core.config.Connettore connettore, boolean connettoreStatic) {

		if(connettoreStatic) {
			return null; // non visualizzo nulla
		}
		
		TipiConnettore tipo = TipiConnettore.toEnumFromName(connettore.getTipo());
		if(tipo==null) {
			tipo = TipiConnettore.CUSTOM;
		}
		
		String endpoint = null;
		if(TipiConnettore.HTTP.getNome().equals(connettore.getTipo()) || TipiConnettore.HTTPS.getNome().equals(connettore.getTipo())){
			endpoint = getProperty(CostantiConnettori.CONNETTORE_LOCATION, connettore.getPropertyList());
		}
		else if(TipiConnettore.JMS.getNome().equals(connettore.getTipo())){
			endpoint = getProperty(CostantiConnettori.CONNETTORE_LOCATION, connettore.getPropertyList());
		}
		else if(TipiConnettore.FILE.getNome().equals(connettore.getTipo())){
			endpoint = getProperty(CostantiConnettori.CONNETTORE_FILE_REQUEST_OUTPUT_FILE, connettore.getPropertyList());
		}
		else if(TipiConnettore.NULL.getNome().equals(connettore.getTipo())){
			endpoint = org.openspcoop2.pdd.core.connettori.ConnettoreNULL.LOCATION;
		}
		else if(TipiConnettore.NULLECHO.getNome().equals(connettore.getTipo())){
			endpoint = org.openspcoop2.pdd.core.connettori.ConnettoreNULLEcho.LOCATION;
		}
		else if(TipiConnettore.STATUS.getNome().equals(connettore.getTipo())){
			endpoint = org.openspcoop2.pdd.core.connettori.ConnettoreStatus.LOCATION;
		}
		else {
			String endpointV = getProperty(CostantiConnettori.CONNETTORE_LOCATION, connettore.getPropertyList());
			if(StringUtils.isNotEmpty(endpointV)) {
				endpoint = endpointV;
			}
		}
		return endpoint;
	}
	
	public static String getNegoziazioneTokenPolicyConnettore(org.openspcoop2.core.registry.Connettore connettore) {
		return getNegoziazioneTokenPolicyConnettore(connettore.mappingIntoConnettoreConfigurazione());
	}
	public static String getNegoziazioneTokenPolicyConnettore(org.openspcoop2.core.config.Connettore connettore) {
		return getProperty(CostantiConnettori.CONNETTORE_TOKEN_POLICY, connettore.getPropertyList());
	}
	
	public static String getNegoziazioneTokenEndpoint(GenericProperties gp, Logger log) {
		PolicyNegoziazioneToken policy = null;
		try {
			policy = TokenUtilities.convertTo(gp);
			return policy.getEndpoint();
		}catch(Exception e) {
			log.error("Errore durante il reperimento dell'endpoint della policy '"+gp.getNome()+"': "+e.getMessage(),e);
			return null;
		}
	}
	
	private static String getProperty(String nome,List<org.openspcoop2.core.config.Property> list){
		if(list!=null && list.size()>0){
			for (org.openspcoop2.core.config.Property property : list) {
				if(property.getNome().equals(nome)){
					return property.getValore();
				}
			}
		}
		return null;
	}
	
	
	public static String getNomeConnettori(Context context) {
		String connettoriMultipli = null;
		if(context.containsKey(org.openspcoop2.core.constants.Costanti.CONSEGNA_MULTIPLA_CONNETTORI_BY_ID)) {
			Object oConnettori = context.getObject(org.openspcoop2.core.constants.Costanti.CONSEGNA_MULTIPLA_CONNETTORI_BY_ID );
			if (oConnettori instanceof List){
				List<?> l = (List<?>) oConnettori;
				String s = getNomeConnettori(l);
				if(s!=null && s.length()>0) {
					return s;
				}
			}
		}
		return connettoriMultipli;
	}
	private static String getNomeConnettori(List<?> l) {
		if(!l.isEmpty()) {
			StringBuilder sb = new StringBuilder();
			for (Object object : l) {
				if(object instanceof String) {
					String s = (String) object;
					if(sb.length()>0) {
						sb.append(",");
					}
					sb.append(s);
				}
			}
			if(sb.length()>0) {
				return sb.toString();
			}
		}
		return null;
	}
}