AbstractConfigChecker.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.jmx;

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

import org.openspcoop2.core.commons.CoreException;
import org.openspcoop2.core.config.GenericProperties;
import org.openspcoop2.core.config.ServizioApplicativo;
import org.openspcoop2.core.constants.StatoCheck;
import org.openspcoop2.core.registry.Soggetto;
import org.openspcoop2.pdd.config.ConfigurazioneNodiRuntime;
import org.openspcoop2.pdd.config.ConfigurazionePdDReader;
import org.openspcoop2.pdd.config.InvokerNodiRuntime;
import org.openspcoop2.pdd.core.connettori.ConnettoreCheck;
import org.openspcoop2.protocol.registry.CertificateCheck;
import org.openspcoop2.protocol.registry.RegistroServiziReader;
import org.slf4j.Logger;


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

	private static String getErrorMessage(String risorsa,String nomeNodoRuntime,Exception e) {
		return "Errore durante la verifica dei certificati (jmxResource '"+risorsa+"') (node:"+nomeNodoRuntime+"): "+e.getMessage();
	}
	private static String getErrorMessageClasseNonGestita(Object o) {
		return "Classe '"+o.getClass().getName()+"' non gestita";
	}
	
	public static void addErrore(Map<String,List<String>> mapErrori, String errore, String nomeNodoRuntime) {
		if(mapErrori.containsKey(errore)) {
			List<String> l = mapErrori.get(errore);
			l.add(nomeNodoRuntime);
		}
		else {
			List<String> l = new ArrayList<>();
			l.add(nomeNodoRuntime);
			mapErrori.put(errore, l);
		}
	}
	
	public static void printErrore(Map<String,List<String>> mapErrori, StringBuilder sbDetails) {
		printErrore(mapErrori, sbDetails, -1, "");
	}
	public static void printErrore(Map<String,List<String>> mapErrori, StringBuilder sbDetails, int nodes, String multipleNodeSeparator) {
		if(!mapErrori.isEmpty()) {
			if(mapErrori.size()==1) {
				if(sbDetails.length()>0) {
					sbDetails.append("\n");
				}
				String errore = mapErrori.keySet().iterator().next();
				
				List<String> nodiRuntimeErrore = mapErrori.get(errore);
				if(nodes>1 && (nodiRuntimeErrore!=null && nodiRuntimeErrore.size()!=nodes)) {
					String nodesLabel = printNodes(mapErrori, errore);
					sbDetails.append("(").append(nodesLabel).append(") ");
				}
				
				sbDetails.append(errore);
			}
			else {
				boolean first = true;
				for (String errore : mapErrori.keySet()) {
					if(sbDetails.length()>0) {
						sbDetails.append("\n");
						sbDetails.append(multipleNodeSeparator);
					}
					else {
						if(first) {
							first = false;
						}
						else {
							sbDetails.append("\n");
							sbDetails.append(multipleNodeSeparator);
						}
					}
					
					String nodesLabel = printNodes(mapErrori, errore);
					sbDetails.append("(").append(nodesLabel).append(") ");
					
					sbDetails.append(errore);
				}
			}
		}
	}
	private static String printNodes(Map<String,List<String>> mapErrori, String errore) {
		List<String> nodiRuntimeErrore = mapErrori.get(errore);
		StringBuilder sbNodir = new StringBuilder();
		for (String nodo : nodiRuntimeErrore) {
			if(sbNodir.length()>0) {
				sbNodir.append(", ");
			}
			sbNodir.append(nodo);
		}
		return sbNodir.toString();
	}
	
	protected String getMultipleNodeSeparator() {
		return "";
	}
	
	public abstract void error(String msg);
	public abstract void error(String msg, Throwable t);
	public abstract Logger getInternalLogger();
	
	public abstract boolean isUseApiCertificatoApplicativoById() throws CoreException;
	public abstract boolean isUseApiCertificatoSoggettoById() throws CoreException;
	
	public abstract String getJmxResourceType() throws CoreException;
	public abstract String getJmxResourceNomeRisorsaConfigurazionePdD() throws CoreException;
	public abstract String getJmxResourceNomeRisorsaAccessoRegistroServizi() throws CoreException;
	
	public abstract String getJmxResourceNomeMetodoCheckConnettoreById() throws CoreException;
	public abstract String getJmxResourceNomeMetodoCheckCertificatoApplicativoById() throws CoreException;
	public abstract String getJmxResourceNomeMetodoCheckCertificatoModIApplicativoById() throws CoreException;
	public abstract String getJmxResourceNomeMetodoCheckCertificatoSoggettoById() throws CoreException;
	public abstract String getJmxResourceNomeMetodoCheckCertificatiConnettoreHttpsById() throws CoreException;
	public abstract String getJmxResourceNomeMetodoCheckCertificatiModIErogazioneById() throws CoreException;
	public abstract String getJmxResourceNomeMetodoCheckCertificatiModIFruizioneById() throws CoreException;
	public abstract String getJmxResourceNomeMetodoCheckCertificatiMessageSecurityErogazioneById() throws CoreException;
	public abstract String getJmxResourceNomeMetodoCheckCertificatiMessageSecurityFruizioneById() throws CoreException;
	public abstract String getJmxResourceNomeMetodoCheckCertificatiJvm() throws CoreException;
	public abstract String getJmxResourceNomeMetodoCheckCertificatiConnettoreHttpsTokenPolicyValidazione() throws CoreException;
	public abstract String getJmxResourceNomeMetodoCheckCertificatiValidazioneJwtTokenPolicyValidazione() throws CoreException;
	public abstract String getJmxResourceNomeMetodoCheckCertificatiForwardToJwtTokenPolicyValidazione() throws CoreException;
	public abstract String getJmxResourceNomeMetodoCheckCertificatiConnettoreHttpsTokenPolicyNegoziazione() throws CoreException;
	public abstract String getJmxResourceNomeMetodoCheckCertificatiSignedJwtTokenPolicyNegoziazione() throws CoreException;
	public abstract String getJmxResourceNomeMetodoCheckCertificatiConnettoreHttpsAttributeAuthority() throws CoreException;
	public abstract String getJmxResourceNomeMetodoCheckCertificatiAttributeAuthorityJwtRichiesta() throws CoreException;
	public abstract String getJmxResourceNomeMetodoCheckCertificatiAttributeAuthorityJwtRisposta() throws CoreException;
	
	private InvokerNodiRuntime invoker;
	private ConfigurazioneNodiRuntime config;
	private List<String> nodiRuntime;
	protected AbstractConfigChecker(InvokerNodiRuntime invoker, ConfigurazioneNodiRuntime config, List<String> nodiRuntime) {
		this.invoker = invoker;
		this.config = config;
		this.nodiRuntime = nodiRuntime;
	}
	
	public void checkApplicativo(StringBuilder sbDetailsError, StringBuilder sbDetailsWarning,
		    boolean ssl, boolean sicurezzaModi, boolean connettoreHttps, org.openspcoop2.core.config.ServizioApplicativo servizioApplicativo,
		    int sogliaWarningGiorni) throws CoreException {
		
		StringBuilder sbError = new StringBuilder();
		
		StringBuilder sbWarning = new StringBuilder();
		StringBuilder sbWarningModi = new StringBuilder();
		StringBuilder sbWarningConnettore = new StringBuilder();
		
		if(ssl) {
			checkCertificate(sbError, sbWarning, 
					sogliaWarningGiorni,
					servizioApplicativo);
		}
		
		if(sbError.length()<=0 &&
			sicurezzaModi) {
			checkCertificateModI(sbError, sbWarningModi, 
					sogliaWarningGiorni,
					servizioApplicativo);
		}
		
		if(sbError.length()<=0 &&
			connettoreHttps) {
			org.openspcoop2.core.config.Connettore connettore = null;
			if(servizioApplicativo.getInvocazioneServizio()!=null) {
				connettore = servizioApplicativo.getInvocazioneServizio().getConnettore();
			}
			if(connettore!=null) {
				checkCertificate(sbError, sbWarningConnettore, 
						sogliaWarningGiorni,
						connettore);	
			}
		}
		
		if(sbError.length()>0) {
			sbDetailsError.append(sbError.toString());
		}
		else {
			if(sbWarning.length()>0) {
				sbDetailsWarning.append(sbWarning.toString());
			}
			else if(sbWarningModi.length()>0) {
				sbDetailsWarning.append(sbWarningModi.toString());
			}
			else if(sbWarningConnettore.length()>0) {
				sbDetailsWarning.append(sbWarningConnettore.toString());
			}
		}
		
	}
	
	public void checkSoggetto(StringBuilder sbDetailsError, StringBuilder sbDetailsWarning,
		    boolean ssl, org.openspcoop2.core.registry.Soggetto soggetto, 
		    int sogliaWarningGiorni) throws CoreException {
		
		StringBuilder sbError = new StringBuilder();
		
		StringBuilder sbWarning = new StringBuilder();
		
		if(ssl) {
			checkCertificate(sbError, sbWarning, 
					sogliaWarningGiorni,
					soggetto);
		}
		
		if(sbError.length()>0) {
			sbDetailsError.append(sbError.toString());
		}
		else {
			if(sbWarning.length()>0) {
				sbDetailsWarning.append(sbWarning.toString());
			}
		}
		
	}
	
	public void checkErogazione(StringBuilder sbDetailsError, StringBuilder sbDetailsWarning,
			boolean connettoreSsl, org.openspcoop2.core.config.Connettore connettore,
			boolean sicurezzaModi, 
			boolean messageSecurity, 
			org.openspcoop2.core.registry.AccordoServizioParteSpecifica asps,
			int sogliaWarningGiorni) throws CoreException {
		List<org.openspcoop2.core.config.Connettore> connettori = null;
		if(connettore!=null) {
			connettori = new ArrayList<>();
			connettori.add(connettore);
		}
		checkErogazione(sbDetailsError, sbDetailsWarning,
				connettoreSsl, connettori,
				sicurezzaModi, 
				messageSecurity, 
				asps,
				sogliaWarningGiorni);
	}
	public void checkErogazione(StringBuilder sbDetailsError, StringBuilder sbDetailsWarning,
			boolean connettoreSsl, List<org.openspcoop2.core.config.Connettore> connettori,
			boolean sicurezzaModi, 
			boolean messageSecurity, 
			org.openspcoop2.core.registry.AccordoServizioParteSpecifica asps,
			int sogliaWarningGiorni) throws CoreException {
		
		StringBuilder sbError = new StringBuilder();
		
		StringBuilder sbWarning = new StringBuilder();
		StringBuilder sbWarningModi = new StringBuilder();
		StringBuilder sbWarningSicurezzaMessaggio = new StringBuilder();
		
		if(connettoreSsl && connettori!=null && !connettori.isEmpty()) {
			for (org.openspcoop2.core.config.Connettore connettore : connettori) {
				StringBuilder sbWarningConnettore = new StringBuilder();
				if(sbError.length()<=0) {
					checkCertificate(sbError, sbWarningConnettore, 
							sogliaWarningGiorni,
							connettore);	
				}
				if(sbWarning.length()<=0 && sbWarningConnettore.length()>0) {
					sbWarning.append(sbWarningConnettore.toString()); // tengo solo un warning alla volta, come per gli errori
				}
			}
		}
		
		if(sbError.length()<=0 &&
			sicurezzaModi) {
			checkCertificateModI(sbError, sbWarningModi, 
					sogliaWarningGiorni,
					asps);
		}
		
		if(sbError.length()<=0 &&
				messageSecurity) {
				checkCertificateMessageSecurity(sbError, sbWarningSicurezzaMessaggio, 
						sogliaWarningGiorni,
						asps);
			}
		
		if(sbError.length()>0) {
			sbDetailsError.append(sbError.toString());
		}
		else {
			if(sbWarning.length()>0) {
				sbDetailsWarning.append(sbWarning.toString());
			}
			else if(sbWarningModi.length()>0) {
				sbDetailsWarning.append(sbWarningModi.toString());
			}
			else if(sbWarningSicurezzaMessaggio.length()>0) {
				sbDetailsWarning.append(sbWarningSicurezzaMessaggio.toString());
			}
		}
		
	}
	
	public void checkFruizione(StringBuilder sbDetailsError, StringBuilder sbDetailsWarning,
			boolean connettoreSsl, org.openspcoop2.core.registry.Connettore connettore,
			boolean sicurezzaModi, 
			boolean messageSecurity,
			org.openspcoop2.core.registry.AccordoServizioParteSpecifica asps, org.openspcoop2.core.registry.Fruitore fruitore,
			int sogliaWarningGiorni) throws CoreException {
		List<org.openspcoop2.core.registry.Connettore> connettori = null;
		if(connettore!=null) {
			connettori = new ArrayList<>();
			connettori.add(connettore);
		}
		checkFruizione(sbDetailsError, sbDetailsWarning,
				connettoreSsl, connettori,
				sicurezzaModi, 
				messageSecurity,
				asps, fruitore,
				sogliaWarningGiorni);
	}
	public void checkFruizione(StringBuilder sbDetailsError, StringBuilder sbDetailsWarning,
			boolean connettoreSsl, List<org.openspcoop2.core.registry.Connettore> connettori,
			boolean sicurezzaModi, 
			boolean messageSecurity,
			org.openspcoop2.core.registry.AccordoServizioParteSpecifica asps, org.openspcoop2.core.registry.Fruitore fruitore,
			int sogliaWarningGiorni) throws CoreException {
		
		if(asps!=null) {
			// nop
		}
		
		StringBuilder sbError = new StringBuilder();
		
		StringBuilder sbWarning = new StringBuilder();
		StringBuilder sbWarningModi = new StringBuilder();
		StringBuilder sbWarningSicurezzaMessaggio = new StringBuilder();
		
		if(connettoreSsl && connettori!=null && !connettori.isEmpty()) {
			for (org.openspcoop2.core.registry.Connettore connettore : connettori) {
				StringBuilder sbWarningConnettore = new StringBuilder();
				if(sbError.length()<=0) {
					checkCertificate(sbError, sbWarningConnettore, 
							sogliaWarningGiorni,
							connettore);	
				}
				if(sbWarning.length()<=0 && sbWarningConnettore.length()>0) {
					sbWarning.append(sbWarningConnettore.toString()); // tengo solo un warning alla volta, come per gli errori
				}
			}
		}
		
		if(sbError.length()<=0 &&
			sicurezzaModi) {
			checkCertificateModI(sbError, sbWarningModi, 
					sogliaWarningGiorni,
					fruitore);
		}
		
		if(sbError.length()<=0 &&
				messageSecurity) {
			checkCertificateMessageSecurity(sbError, sbWarningSicurezzaMessaggio, 
					sogliaWarningGiorni,
					fruitore);
		}
		
		if(sbError.length()>0) {
			sbDetailsError.append(sbError.toString());
		}
		else {
			if(sbWarning.length()>0) {
				sbDetailsWarning.append(sbWarning.toString());
			}
			else if(sbWarningModi.length()>0) {
				sbDetailsWarning.append(sbWarningModi.toString());
			}
			else if(sbWarningSicurezzaMessaggio.length()>0) {
				sbDetailsWarning.append(sbWarningSicurezzaMessaggio.toString());
			}
		}
		
	}
	
	
	public void checkConfigurazioneJvm(StringBuilder sbDetailsError, StringBuilder sbDetailsWarning,
		    int sogliaWarningGiorni) throws CoreException {
		
		StringBuilder sbError = new StringBuilder();
		
		StringBuilder sbWarning = new StringBuilder();
		
		checkCertificate(sbError, sbWarning, 
					sogliaWarningGiorni,
					new org.openspcoop2.core.config.Configurazione());
		
		if(sbError.length()>0) {
			sbDetailsError.append(sbError.toString());
		}
		else {
			if(sbWarning.length()>0) {
				sbDetailsWarning.append(sbWarning.toString());
			}
		}
		
	}
	
	
	public void checkTokenPolicyValidazione(StringBuilder sbDetailsError, StringBuilder sbDetailsWarning,
			boolean httpsDynamicDiscovery, boolean httpsValidazioneJWT, boolean httpsIntrospection, boolean httpsUserInfo, 
			boolean validazioneJwt, boolean forwardToJwt,
			GenericProperties gp,
			int sogliaWarningGiorni) throws CoreException {
		
		StringBuilder sbError = new StringBuilder();
		
		StringBuilder sbWarningDynamicDiscovery = new StringBuilder();
		StringBuilder sbWarningValidazioneJwtHttps = new StringBuilder();
		StringBuilder sbWarningIntrospection = new StringBuilder();
		StringBuilder sbWarningUserInfo = new StringBuilder();
		StringBuilder sbWarningValidazioneJwt = new StringBuilder();
		StringBuilder sbWarningForwardToJwt = new StringBuilder();
		
		if(httpsDynamicDiscovery) {
			checkCertificateGenericProperties(sbError, sbWarningDynamicDiscovery, 
					sogliaWarningGiorni,
					getJmxResourceNomeMetodoCheckCertificatiConnettoreHttpsTokenPolicyValidazione(), 
					gp.getNome(), ConnettoreCheck.POLICY_TIPO_ENDPOINT_DYNAMIC_DISCOVERY);
		}
		if(sbError.length()<=0 &&
			httpsValidazioneJWT) {
			checkCertificateGenericProperties(sbError, sbWarningValidazioneJwtHttps, 
					sogliaWarningGiorni,
					getJmxResourceNomeMetodoCheckCertificatiConnettoreHttpsTokenPolicyValidazione(), 
					gp.getNome(), ConnettoreCheck.POLICY_TIPO_ENDPOINT_VALIDAZIONE_JWT);
		}
		if(sbError.length()<=0 &&
			httpsIntrospection) {
			checkCertificateGenericProperties(sbError, sbWarningIntrospection, 
					sogliaWarningGiorni,
					getJmxResourceNomeMetodoCheckCertificatiConnettoreHttpsTokenPolicyValidazione(), 
					gp.getNome(), ConnettoreCheck.POLICY_TIPO_ENDPOINT_INTROSPECTION);
		}
		if(sbError.length()<=0 &&
			httpsUserInfo) {
			checkCertificateGenericProperties(sbError, sbWarningUserInfo, 
					sogliaWarningGiorni,
					getJmxResourceNomeMetodoCheckCertificatiConnettoreHttpsTokenPolicyValidazione(), 
					gp.getNome(), ConnettoreCheck.POLICY_TIPO_ENDPOINT_USERINFO);
		}
		if(sbError.length()<=0 &&
			validazioneJwt) {
			checkCertificateGenericProperties(sbError, sbWarningValidazioneJwt, 
					sogliaWarningGiorni,
					getJmxResourceNomeMetodoCheckCertificatiValidazioneJwtTokenPolicyValidazione(),
					gp.getNome());
		}
		if(sbError.length()<=0 &&
			forwardToJwt) {
			checkCertificateGenericProperties(sbError, sbWarningForwardToJwt, 
					sogliaWarningGiorni,
					getJmxResourceNomeMetodoCheckCertificatiForwardToJwtTokenPolicyValidazione(),
					gp.getNome());
		}
		
		if(sbError.length()>0) {
			sbDetailsError.append(sbError.toString());
		}
		else {
			if(sbWarningDynamicDiscovery.length()>0) {
				sbDetailsWarning.append(sbWarningDynamicDiscovery.toString());
			}
			else if(sbWarningValidazioneJwtHttps.length()>0) {
				sbDetailsWarning.append(sbWarningValidazioneJwtHttps.toString());
			}
			else if(sbWarningIntrospection.length()>0) {
				sbDetailsWarning.append(sbWarningIntrospection.toString());
			}
			else if(sbWarningUserInfo.length()>0) {
				sbDetailsWarning.append(sbWarningUserInfo.toString());
			}
			else if(sbWarningValidazioneJwt.length()>0) {
				sbDetailsWarning.append(sbWarningValidazioneJwt.toString());
			}
			else if(sbWarningForwardToJwt.length()>0) {
				sbDetailsWarning.append(sbWarningForwardToJwt.toString());
			}
		}
		
	}
	
	
	public void checkTokenPolicyNegoziazione(StringBuilder sbDetailsError, StringBuilder sbDetailsWarning,
			boolean https, boolean signedJwt,
			GenericProperties gp,
			int sogliaWarningGiorni) throws CoreException {
		
		StringBuilder sbError = new StringBuilder();
		
		StringBuilder sbWarning = new StringBuilder();
		StringBuilder sbWarningSignedJwt = new StringBuilder();
		
		if(https) {
			checkCertificateGenericProperties(sbError, sbWarning, 
					sogliaWarningGiorni,
					getJmxResourceNomeMetodoCheckCertificatiConnettoreHttpsTokenPolicyNegoziazione(),
					gp.getNome());
		}
		if(sbError.length()<=0 &&
			signedJwt) {
			checkCertificateGenericProperties(sbError, sbWarningSignedJwt, 
					sogliaWarningGiorni,
					getJmxResourceNomeMetodoCheckCertificatiSignedJwtTokenPolicyNegoziazione(), 
					gp.getNome());
		}
		
		if(sbError.length()>0) {
			sbDetailsError.append(sbError.toString());
		}
		else {
			if(sbWarning.length()>0) {
				sbDetailsWarning.append(sbWarning.toString());
			}
			else if(sbWarningSignedJwt.length()>0) {
				sbDetailsWarning.append(sbWarningSignedJwt.toString());
			}
		}
		
	}
	
	
	public void checkAttributeAuthority(StringBuilder sbDetailsError, StringBuilder sbDetailsWarning,
			boolean https, boolean jwtRichiesta, boolean jwtRisposta,
			GenericProperties gp,
			int sogliaWarningGiorni) throws CoreException {
		
		StringBuilder sbError = new StringBuilder();
		
		StringBuilder sbWarning = new StringBuilder();
		StringBuilder sbWarningJwtRichiesta = new StringBuilder();
		StringBuilder sbWarningJwtRisposta = new StringBuilder();
		
		if(https) {
			checkCertificateGenericProperties(sbError, sbWarning, 
					sogliaWarningGiorni,
					getJmxResourceNomeMetodoCheckCertificatiConnettoreHttpsAttributeAuthority(),
					gp.getNome());
		}
		if(sbError.length()<=0 &&
			jwtRichiesta) {
			checkCertificateGenericProperties(sbError, sbWarningJwtRichiesta, 
					sogliaWarningGiorni,
					getJmxResourceNomeMetodoCheckCertificatiAttributeAuthorityJwtRichiesta(),
					gp.getNome());
		}
		if(sbError.length()<=0 &&
			jwtRisposta) {
			checkCertificateGenericProperties(sbError, sbWarningJwtRisposta, 
					sogliaWarningGiorni,
					getJmxResourceNomeMetodoCheckCertificatiAttributeAuthorityJwtRisposta(),
					gp.getNome());
		}
		
		if(sbError.length()>0) {
			sbDetailsError.append(sbError.toString());
		}
		else {
			if(sbWarning.length()>0) {
				sbDetailsWarning.append(sbWarning.toString());
			}
			else if(sbWarningJwtRichiesta.length()>0) {
				sbDetailsWarning.append(sbWarningJwtRichiesta.toString());
			}
			else if(sbWarningJwtRisposta.length()>0) {
				sbDetailsWarning.append(sbWarningJwtRisposta.toString());
			}
		}
		
	}
	
	
	private void checkCertificate(StringBuilder sbDetailsError, StringBuilder sbDetailsWarning,  
			int sogliaWarningGiorni,
			Object o) throws CoreException {
		
		String risorsa = null;
		String metodo = null;
		boolean useApi = false;
		boolean applicativo = false;
		boolean soggetto = false;
		boolean connettoreErogazione = false;
		boolean connettoreFruizione = false;
		long idObject = -1;
		boolean withId = true;
		if(o instanceof ServizioApplicativo) {
			applicativo = true;
		}
		else if(o instanceof Soggetto) {
			soggetto = true;
		}
		else if(o instanceof org.openspcoop2.core.config.Connettore) {
			connettoreErogazione = true;
		}
		else if(o instanceof org.openspcoop2.core.registry.Connettore) {
			connettoreFruizione = true;
		}
		else if(o instanceof org.openspcoop2.core.config.Configurazione) {
			risorsa = this.getJmxResourceNomeRisorsaConfigurazionePdD();
			metodo = this.getJmxResourceNomeMetodoCheckCertificatiJvm();
			withId = false;
		}
		else {
			throw new CoreException(getErrorMessageClasseNonGestita(o));
		}
		
		if(applicativo) {
			idObject = ((ServizioApplicativo)o).getId();
			useApi = this.isUseApiCertificatoApplicativoById();
			if(!useApi) {
				risorsa = this.getJmxResourceNomeRisorsaConfigurazionePdD();
				metodo = this.getJmxResourceNomeMetodoCheckCertificatoApplicativoById();
			}
		}
		else if(soggetto) {
			idObject = ((Soggetto)o).getId();
			useApi = this.isUseApiCertificatoSoggettoById();
			if(!useApi) {
				risorsa = this.getJmxResourceNomeRisorsaAccessoRegistroServizi();
				metodo = this.getJmxResourceNomeMetodoCheckCertificatoSoggettoById();
			}
		}
		else if(connettoreErogazione) {
			idObject = ((org.openspcoop2.core.config.Connettore)o).getId();
			risorsa = this.getJmxResourceNomeRisorsaConfigurazionePdD();
			metodo = this.getJmxResourceNomeMetodoCheckCertificatiConnettoreHttpsById();
		}
		else if(connettoreFruizione) {
			idObject = ((org.openspcoop2.core.registry.Connettore)o).getId();
			risorsa = this.getJmxResourceNomeRisorsaAccessoRegistroServizi();
			metodo = this.getJmxResourceNomeMetodoCheckCertificatiConnettoreHttpsById();
		}
		
		Map<String,List<String>> mapErrori = new HashMap<>();
		Map<String,List<String>> mapWarning = new HashMap<>();
		
		String error = StatoCheck.ERROR.toString();
		String warn = StatoCheck.WARN.toString();
		String ok = StatoCheck.OK.toString();
		
		List<String> nodiRuntimeEsaminati = new ArrayList<>();
		if(useApi) {
			nodiRuntimeEsaminati.add("SDK");
		}
		else {
			nodiRuntimeEsaminati.addAll(this.nodiRuntime);
		}
		
		for (String nomeNodoRuntime : nodiRuntimeEsaminati) {
			String stato = null;
			String descrizione = null;
			String errorDetail = null;
			String warnDetail = null;
			try{		
				if(useApi) {
					boolean addCertificateDetails = true;
					String separator = ": ";
					String newLine = "\n";
					try {
						CertificateCheck statoCheck = null;
						if(applicativo) {
							statoCheck = ConfigurazionePdDReader.checkCertificatoApplicativo(((ServizioApplicativo)o), sogliaWarningGiorni, 
									addCertificateDetails, separator, newLine,
									this.getInternalLogger());
						}
						else if(soggetto) {
							statoCheck = RegistroServiziReader.checkCertificatoSoggetto(((Soggetto)o), sogliaWarningGiorni, 
									addCertificateDetails, separator, newLine,
									this.getInternalLogger());
						}
						else {
							throw new CoreException("Incorrect invocation: (useApi:"+useApi+" applicativo:"+applicativo+" soggetto:"+soggetto+")");
						}
						stato = statoCheck.toString(newLine);
					}catch(Exception e){
						stato = JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage();
					}
				}
				else {
					if(this.config.containsNode(nomeNodoRuntime)) {
						descrizione = this.config.getDescrizione(nomeNodoRuntime);
					}
					
					if(withId) {
						stato = this.invoker.invokeJMXMethod(nomeNodoRuntime, this.getJmxResourceType(),
								risorsa, 
								metodo,
								idObject, sogliaWarningGiorni);
					}
					else {
						stato = this.invoker.invokeJMXMethod(nomeNodoRuntime, this.getJmxResourceType(),
								risorsa, 
								metodo,
								sogliaWarningGiorni);
					}
				}
				
				if(stato!=null && stato.equals(error)){
					errorDetail = stato;
				}
				else if(stato!=null && stato.startsWith(error+"\n")){
					errorDetail = stato.substring((error+"\n").length());
				}
				else if(stato!=null && stato.equals(warn)){
					warnDetail = warn;
				}
				else if(stato!=null && stato.startsWith(warn+"\n")){
					warnDetail = stato.substring((warn+"\n").length());
				}
				else if(stato!=null && stato.startsWith(ok)){
					// nop
				}
				else {
					errorDetail = stato;
				}
			}catch(Exception e){
				this.error(getErrorMessage(risorsa,nomeNodoRuntime,e),e);
				stato = e.getMessage();
				errorDetail = stato;
			}
			
			if(errorDetail!=null) {
				AbstractConfigChecker.addErrore(mapErrori, errorDetail, 
						descrizione!=null ? descrizione : nomeNodoRuntime);
			}
			else if(warnDetail!=null) {
				AbstractConfigChecker.addErrore(mapWarning, warnDetail, 
						descrizione!=null ? descrizione : nomeNodoRuntime);
			}
		}
		
		if(!mapErrori.isEmpty()) {
			AbstractConfigChecker.printErrore(mapErrori, sbDetailsError, nodiRuntimeEsaminati.size(), getMultipleNodeSeparator());
		}
		else if(!mapWarning.isEmpty()) {
			AbstractConfigChecker.printErrore(mapWarning, sbDetailsWarning, nodiRuntimeEsaminati.size(), getMultipleNodeSeparator());
		}

	}
	
	private void checkCertificateModI(StringBuilder sbDetailsError, StringBuilder sbDetailsWarning, 
			int sogliaWarningGiorni,
			Object o) throws CoreException {
		
		String risorsa = null;
		String metodo = null;
		boolean applicativo = false;
		boolean erogazione = false;
		boolean fruizione = false;
		long idObject = -1;
		if(o instanceof ServizioApplicativo) {
			applicativo = true;
		}
		else if(o instanceof org.openspcoop2.core.registry.AccordoServizioParteSpecifica) {
			erogazione = true;
		}
		else if(o instanceof org.openspcoop2.core.registry.Fruitore) {
			fruizione = true;
		}
		else {
			throw new CoreException(getErrorMessageClasseNonGestita(o));
		}
		
		if(applicativo) {
			idObject = ((ServizioApplicativo)o).getId();
			risorsa = this.getJmxResourceNomeRisorsaConfigurazionePdD();
			metodo = this.getJmxResourceNomeMetodoCheckCertificatoModIApplicativoById();
		}
		else if(erogazione) {
			idObject = ((org.openspcoop2.core.registry.AccordoServizioParteSpecifica)o).getId();
			risorsa = this.getJmxResourceNomeRisorsaAccessoRegistroServizi();
			metodo = this.getJmxResourceNomeMetodoCheckCertificatiModIErogazioneById();
		}
		else if(fruizione) {
			idObject = ((org.openspcoop2.core.registry.Fruitore)o).getId();
			risorsa = this.getJmxResourceNomeRisorsaAccessoRegistroServizi();
			metodo = this.getJmxResourceNomeMetodoCheckCertificatiModIFruizioneById();
		}
		
		Map<String,List<String>> mapErrori = new HashMap<>();
		Map<String,List<String>> mapWarning = new HashMap<>();
		
		String error = StatoCheck.ERROR.toString();
		String warn = StatoCheck.WARN.toString();
		String ok = StatoCheck.OK.toString();
		
		for (String nomeNodoRuntime : this.nodiRuntime) {
			String stato = null;
			String descrizione = null;
			String errorDetail = null;
			String warnDetail = null;
			try{		
				if(this.config.containsNode(nomeNodoRuntime)) {
					descrizione = this.config.getDescrizione(nomeNodoRuntime);
				}
				
				stato = this.invoker.invokeJMXMethod(nomeNodoRuntime, this.getJmxResourceType(),
						risorsa, 
						metodo,
						idObject, sogliaWarningGiorni);
				
				if(stato!=null && stato.equals(error)){
					errorDetail = stato;
				}
				else if(stato!=null && stato.startsWith(error+"\n")){
					errorDetail = stato.substring((error+"\n").length());
				}
				else if(stato!=null && stato.equals(warn)){
					warnDetail = warn;
				}
				else if(stato!=null && stato.startsWith(warn+"\n")){
					warnDetail = stato.substring((warn+"\n").length());
				}
				else if(stato!=null && stato.startsWith(ok)){
					// nop
				}
				else {
					errorDetail = stato;
				}
			}catch(Exception e){
				this.error(getErrorMessage(risorsa,nomeNodoRuntime,e),e);
				stato = e.getMessage();
				errorDetail = stato;
			}
			
			if(errorDetail!=null) {
				AbstractConfigChecker.addErrore(mapErrori, errorDetail, 
						descrizione!=null ? descrizione : nomeNodoRuntime);
			}
			else if(warnDetail!=null) {
				AbstractConfigChecker.addErrore(mapWarning, warnDetail, 
						descrizione!=null ? descrizione : nomeNodoRuntime);
			}
		}
		
		if(!mapErrori.isEmpty()) {
			AbstractConfigChecker.printErrore(mapErrori, sbDetailsError, this.nodiRuntime.size(), getMultipleNodeSeparator());
		}
		else if(!mapWarning.isEmpty()) {
			AbstractConfigChecker.printErrore(mapWarning, sbDetailsWarning, this.nodiRuntime.size(), getMultipleNodeSeparator());
		}

	}
	
	private void checkCertificateMessageSecurity(StringBuilder sbDetailsError, StringBuilder sbDetailsWarning, 
			int sogliaWarningGiorni,
			Object o) throws CoreException {
		
		String risorsa = null;
		String metodo = null;
		boolean erogazione = false;
		boolean fruizione = false;
		long idObject = -1;
		if(o instanceof org.openspcoop2.core.registry.AccordoServizioParteSpecifica) {
			erogazione = true;
		}
		else if(o instanceof org.openspcoop2.core.registry.Fruitore) {
			fruizione = true;
		}
		else {
			throw new CoreException(getErrorMessageClasseNonGestita(o));
		}
		
		if(erogazione) {
			idObject = ((org.openspcoop2.core.registry.AccordoServizioParteSpecifica)o).getId();
			risorsa = this.getJmxResourceNomeRisorsaConfigurazionePdD();
			metodo = this.getJmxResourceNomeMetodoCheckCertificatiMessageSecurityErogazioneById();
		}
		else if(fruizione) {
			idObject = ((org.openspcoop2.core.registry.Fruitore)o).getId();
			risorsa = this.getJmxResourceNomeRisorsaConfigurazionePdD();
			metodo = this.getJmxResourceNomeMetodoCheckCertificatiMessageSecurityFruizioneById();
		}
		
		Map<String,List<String>> mapErrori = new HashMap<>();
		Map<String,List<String>> mapWarning = new HashMap<>();
		
		String error = StatoCheck.ERROR.toString();
		String warn = StatoCheck.WARN.toString();
		String ok = StatoCheck.OK.toString();
		
		for (String nomeNodoRuntime : this.nodiRuntime) {
			String stato = null;
			String descrizione = null;
			String errorDetail = null;
			String warnDetail = null;
			try{		
				if(this.config.containsNode(nomeNodoRuntime)) {
					descrizione = this.config.getDescrizione(nomeNodoRuntime);
				}
				
				stato = this.invoker.invokeJMXMethod(nomeNodoRuntime, this.getJmxResourceType(),
						risorsa, 
						metodo,
						idObject, sogliaWarningGiorni);
				
				if(stato!=null && stato.equals(error)){
					errorDetail = stato;
				}
				else if(stato!=null && stato.startsWith(error+"\n")){
					errorDetail = stato.substring((error+"\n").length());
				}
				else if(stato!=null && stato.equals(warn)){
					warnDetail = warn;
				}
				else if(stato!=null && stato.startsWith(warn+"\n")){
					warnDetail = stato.substring((warn+"\n").length());
				}
				else if(stato!=null && stato.startsWith(ok)){
					// nop
				}
				else {
					errorDetail = stato;
				}
			}catch(Exception e){
				this.error(getErrorMessage(risorsa,nomeNodoRuntime,e),e);
				stato = e.getMessage();
				errorDetail = stato;
			}
			
			if(errorDetail!=null) {
				AbstractConfigChecker.addErrore(mapErrori, errorDetail, 
						descrizione!=null ? descrizione : nomeNodoRuntime);
			}
			else if(warnDetail!=null) {
				AbstractConfigChecker.addErrore(mapWarning, warnDetail, 
						descrizione!=null ? descrizione : nomeNodoRuntime);
			}
		}
		
		if(!mapErrori.isEmpty()) {
			AbstractConfigChecker.printErrore(mapErrori, sbDetailsError, this.nodiRuntime.size(), getMultipleNodeSeparator());
		}
		else if(!mapWarning.isEmpty()) {
			AbstractConfigChecker.printErrore(mapWarning, sbDetailsWarning, this.nodiRuntime.size(), getMultipleNodeSeparator());
		}

	}
	
	private void checkCertificateGenericProperties(StringBuilder sbDetailsError, StringBuilder sbDetailsWarning, 
			int sogliaWarningGiorni,
			String metodo, String nomePolicy) throws CoreException {
		checkCertificateGenericProperties(sbDetailsError, sbDetailsWarning, 
				sogliaWarningGiorni,
				metodo, nomePolicy, null); 
	}
	private void checkCertificateGenericProperties(StringBuilder sbDetailsError, StringBuilder sbDetailsWarning, 
			int sogliaWarningGiorni,
			String metodo, String nomePolicy, String tipo) throws CoreException {
		
		String risorsa = this.getJmxResourceNomeRisorsaConfigurazionePdD();
				
		Map<String,List<String>> mapErrori = new HashMap<>();
		Map<String,List<String>> mapWarning = new HashMap<>();
		
		String error = StatoCheck.ERROR.toString();
		String warn = StatoCheck.WARN.toString();
		String ok = StatoCheck.OK.toString();
		
		for (String nomeNodoRuntime : this.nodiRuntime) {
			String stato = null;
			String descrizione = null;
			String errorDetail = null;
			String warnDetail = null;
			try{		
				if(this.config.containsNode(nomeNodoRuntime)) {
					descrizione = this.config.getDescrizione(nomeNodoRuntime);
				}
				
				if(tipo!=null) {
					stato = this.invoker.invokeJMXMethod(nomeNodoRuntime, this.getJmxResourceType(),
							risorsa, 
							metodo,
							nomePolicy, tipo, sogliaWarningGiorni);
				}
				else {
					stato = this.invoker.invokeJMXMethod(nomeNodoRuntime, this.getJmxResourceType(),
							risorsa, 
							metodo,
							nomePolicy, sogliaWarningGiorni);
				}
				
				if(stato!=null && stato.equals(error)){
					errorDetail = stato;
				}
				else if(stato!=null && stato.startsWith(error+"\n")){
					errorDetail = stato.substring((error+"\n").length());
				}
				else if(stato!=null && stato.equals(warn)){
					warnDetail = warn;
				}
				else if(stato!=null && stato.startsWith(warn+"\n")){
					warnDetail = stato.substring((warn+"\n").length());
				}
				else if(stato!=null && stato.startsWith(ok)){
					// nop
				}
				else {
					errorDetail = stato;
				}
			}catch(Exception e){
				this.error(getErrorMessage(risorsa,nomeNodoRuntime,e),e);
				stato = e.getMessage();
				errorDetail = stato;
			}
			
			if(errorDetail!=null) {
				AbstractConfigChecker.addErrore(mapErrori, errorDetail, 
						descrizione!=null ? descrizione : nomeNodoRuntime);
			}
			else if(warnDetail!=null) {
				AbstractConfigChecker.addErrore(mapWarning, warnDetail, 
						descrizione!=null ? descrizione : nomeNodoRuntime);
			}
		}
		
		if(!mapErrori.isEmpty()) {
			AbstractConfigChecker.printErrore(mapErrori, sbDetailsError, this.nodiRuntime.size(), getMultipleNodeSeparator());
		}
		else if(!mapWarning.isEmpty()) {
			AbstractConfigChecker.printErrore(mapWarning, sbDetailsWarning, this.nodiRuntime.size(), getMultipleNodeSeparator());
		}

	}
}