CheckStatoPdD.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.services.connector;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.openspcoop2.core.commons.CoreException;
import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
import org.openspcoop2.pdd.core.CostantiPdD;
import org.openspcoop2.pdd.logger.Dump;
import org.openspcoop2.pdd.logger.MsgDiagnostico;
import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
import org.openspcoop2.pdd.logger.Tracciamento;
import org.openspcoop2.pdd.services.OpenSPCoop2Startup;
import org.openspcoop2.pdd.timers.TimerMonitoraggioRisorseThread;
import org.openspcoop2.pdd.timers.TimerThresholdThread;
import org.openspcoop2.utils.BooleanNullable;
import org.openspcoop2.utils.LoggerWrapperFactory;
import org.openspcoop2.utils.transport.http.HttpConstants;
import org.openspcoop2.utils.transport.http.HttpRequest;
import org.openspcoop2.utils.transport.http.HttpRequestMethod;
import org.openspcoop2.utils.transport.http.HttpResponse;
import org.openspcoop2.utils.transport.http.HttpServletCredential;
import org.openspcoop2.utils.transport.http.HttpUtilities;
import org.slf4j.Logger;

/**
 * Servlet che serve per verificare l'installazione di OpenSPCoop.
 * Ritorna 200 in caso l'installazione sia correttamente inizializzata e tutte le risorse disponibili.
 * Ritorna 500 in caso la PdD non sia in funzione
 *
 * @author Poli Andrea (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */

public class CheckStatoPdD extends HttpServlet {

	 /**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = 1L;

	private static void sendError(HttpServletResponse res, Logger log, String msg, int code) {
		sendError(res, log, msg, code, msg, null);
	}
	private static void sendError(HttpServletResponse res, Logger log, String msg, int code, Throwable e) {
		sendError(res, log, msg, code, msg, e);
	}
	private static void sendError(HttpServletResponse res, Logger log, String msg, int code, String logMsg) {
		sendError(res, log, msg, code, logMsg, null);
	}
	private static void sendError(HttpServletResponse res, Logger log, String msg, int code, String logMsg, Throwable e)  {
		String prefix = "[GovWayCheck] ";
		String msgLog = prefix+logMsg;
		if(e!=null) {
			log.error(msgLog, e);
		}
		else {
			log.error(msgLog);
		}
		res.setStatus(code);
		res.setContentType(HttpConstants.CONTENT_TYPE_PLAIN);
		try {
			res.getOutputStream().write(msg.getBytes());
		}catch(Exception t) {
			log.error("[CheckStato] SendError failed: "+t.getMessage(),t);
		}
	}
	
	private String getPrefixLetturaRisorsa(String resourceName) {
		return "Lettura risorsa ["+resourceName+"] ";
	}
	private String getMsgRisorsaNonAutorizzata(String resourceName) {
		return getPrefixLetturaRisorsa(resourceName)+"non autorizzata";
	}

	private String getMsgDellaRisorsaNonRiuscita(String resourceName) {
		 return "della risorsa ["+resourceName+"] non riuscita";
	}
	
	public static void serializeNotInitializedResponse(HttpServletResponse res, Logger log)  {
		String msg = "API Gateway GovWay non inzializzato";
		sendError(res, log, msg, 503);  // viene volutamente utilizzato il codice 503
	}

	@Override public void doGet(HttpServletRequest req, HttpServletResponse res)
	throws ServletException, IOException {
				
		Logger log = OpenSPCoop2Logger.getLoggerOpenSPCoopCore();
		if(log==null)
			log = LoggerWrapperFactory.getLogger(CheckStatoPdD.class);
		
		if( !OpenSPCoop2Startup.initialize){
			serializeNotInitializedResponse(res, log);
			return;
		}
		
		OpenSPCoop2Properties properties = OpenSPCoop2Properties.getInstance();
			
		// verifico se l'invocazione richiede una lettura di una risorsa jmx
		boolean richiestaRisorsaJmx = false;
		String resourceName = req.getParameter(CostantiPdD.CHECK_STATO_PDD_RESOURCE_NAME);
		if(resourceName!=null && !"".equals(resourceName)){

			boolean checkReadEnabled = false;
			if(properties!=null && properties.isCheckReadJMXResourcesEnabled() ){
				checkReadEnabled = true;
			}
			if(!checkReadEnabled){
				String msg = "Servizio non abilitato";
				sendError(res, log, msg, 500); 
				return;
			}
			
			// prima di procedere verifico una eventuale autenticazione
			String username = properties.getCheckReadJMXResourcesUsername();
			String password = properties.getCheckReadJMXResourcesPassword();
			if(username!=null && password!=null){
				HttpServletCredential identity = new HttpServletCredential(req, log);
				if(!username.equals(identity.getUsername())){
					String msg = getMsgRisorsaNonAutorizzata(resourceName);
					String logMsg = msg+". Richiesta effettuata da username ["+identity.getUsername()+"] sconosciuto";
					sendError(res, log, msg, 500, logMsg); 
					return;
				}
				if(!password.equals(identity.getPassword())){
					String msg = getMsgRisorsaNonAutorizzata(resourceName);
					String logMsg = msg+". Richiesta effettuata da username ["+identity.getUsername()+"] (password errata)";
					sendError(res, log, msg, 500, logMsg); 
					return;
				}
			}
			
			String attributeName = req.getParameter(CostantiPdD.CHECK_STATO_PDD_ATTRIBUTE_NAME);
			String attributeValue = req.getParameter(CostantiPdD.CHECK_STATO_PDD_ATTRIBUTE_VALUE);
			String attributeBooleanValue = req.getParameter(CostantiPdD.CHECK_STATO_PDD_ATTRIBUTE_BOOLEAN_VALUE);
			String methodName = req.getParameter(CostantiPdD.CHECK_STATO_PDD_METHOD_NAME);
			if(attributeName!=null){
				if(attributeValue!=null || attributeBooleanValue!=null){
					try{
						Object v = attributeValue;
						if(attributeBooleanValue!=null){
							v = Boolean.parseBoolean(attributeBooleanValue);
						}
						OpenSPCoop2Startup.gestoreRisorseJMX_staticInstance.setAttribute(resourceName, attributeName, v);
						richiestaRisorsaJmx = true; // se è stata richiesta una operazione jmx non si deve proseguire con il check	
					}catch(Exception e){
						String msg = "Aggiornamento attributo ["+attributeName+"] "+getMsgDellaRisorsaNonRiuscita(resourceName)+" (valore:"+attributeValue+"): "+e.getMessage();
						sendError(res, log, msg, 500, e); 	
						return;
					}
				}
				else{
					try{
						Object value = OpenSPCoop2Startup.gestoreRisorseJMX_staticInstance.getAttribute(resourceName, attributeName);
						res.setContentType(HttpConstants.CONTENT_TYPE_PLAIN);
						res.getOutputStream().write(value.toString().getBytes());	
						richiestaRisorsaJmx = true; // se è stata richiesta una operazione jmx non si deve proseguire con il check
					}catch(Exception e){
						String msg = "Lettura attributo ["+attributeName+"] "+getMsgDellaRisorsaNonRiuscita(resourceName)+": "+e.getMessage();
						sendError(res, log, msg, 500, e); 	
						return;
					}
				}
			}
			else if(attributeValue!=null){
				String msg = getPrefixLetturaRisorsa(resourceName)+"non effettuata, fornito un valore di attributo senza aver indicato il nome";
				sendError(res, log, msg, 500); 	
				return;
			}
			else if(methodName!=null){
				
				Object [] params = null;
				String [] signatures = null;
				try {
					List<Object> paramsL = new ArrayList<>();
					List<String> signaturesL = new ArrayList<>();
					addParameter(paramsL, signaturesL, req);
					if(!paramsL.isEmpty() && !signaturesL.isEmpty()) {
						params = paramsL.toArray(new Object[1]);
						signatures = signaturesL.toArray(new String[1]);
					}
				}catch(Exception e) {
					String msg = "Invocazione metodo ["+methodName+"] "+getMsgDellaRisorsaNonRiuscita(resourceName)+": "+e.getMessage();
					sendError(res, log, msg, 500, e); 
					return;
				}
				
				try{
					Object value = OpenSPCoop2Startup.gestoreRisorseJMX_staticInstance.invoke(resourceName, methodName, params, signatures);
					res.setContentType(HttpConstants.CONTENT_TYPE_PLAIN);
					res.getOutputStream().write(value.toString().getBytes());
					richiestaRisorsaJmx = true; // se è stata richiesta una operazione jmx non si deve proseguire con il check
				}catch(Exception e){
					String msg = "Invocazione metodo ["+methodName+"] "+getMsgDellaRisorsaNonRiuscita(resourceName)+": "+e.getMessage();
					sendError(res, log, msg, 500, e); 
					return;
				}
			}
			else{
				String msg = getPrefixLetturaRisorsa(resourceName)+"non effettuata, nessun attributo o metodo richiesto";
				sendError(res, log, msg, 500); 
				return;
			}
			
		}
		
		if(richiestaRisorsaJmx) {
			return; // se è stata richiesta una operazione jmx non si deve proseguire con il check
		}
		
		CheckStatoPdDHealthCheckStats check = readHealthCheckStats(req, properties);
		if(check!=null) {
			try {
				CheckStatoPdDHealthCheckStatsUtils.verificaInformazioniStatistiche(log, properties,check);
				return; // se è staa richiesta manualmente una verifica delle statistiche non si deve proseguire con il check
			}catch(Exception t) {
				String msg = "Statistics HealthCheck failed\n"+t.getMessage();
				sendError(res, log, msg, 500, t); 
				return;
			}
		}
		
		boolean checkEnabled = false;
		if(properties!=null && properties.isCheckEnabled() ){
			checkEnabled = true;
		}
		if(!checkEnabled){
			String msg = "Servizio non abilitato";
			sendError(res, log, msg, 500); 
			return;
		}
		
						
		if( !OpenSPCoop2Startup.initialize){
			serializeNotInitializedResponse(res, log);
			return;
		}
		else if( !TimerMonitoraggioRisorseThread.isRisorseDisponibili()){
			String msg = "Risorse di sistema non disponibili: "+TimerMonitoraggioRisorseThread.getRisorsaNonDisponibile().getMessage();
			sendError(res, log, msg, 500, TimerMonitoraggioRisorseThread.getRisorsaNonDisponibile()); 
			return;
		}
		else if( !TimerThresholdThread.freeSpace){
			String msg = "Non sono disponibili abbastanza risorse per la gestione della richiesta";
			sendError(res, log, msg, 500); 
			return;
		}
		else if( !Tracciamento.tracciamentoDisponibile){
			String msg = "Tracciatura non disponibile: "+Tracciamento.motivoMalfunzionamentoTracciamento.getMessage();
			sendError(res, log, msg, 500, Tracciamento.motivoMalfunzionamentoTracciamento); 
			return;
		}
		else if( !MsgDiagnostico.gestoreDiagnosticaDisponibile){
			String msg = "Sistema di diagnostica non disponibile: "+MsgDiagnostico.motivoMalfunzionamentoDiagnostici.getMessage();
			sendError(res, log, msg, 500, MsgDiagnostico.motivoMalfunzionamentoDiagnostici); 	
			return;
		}
		else if( !Dump.isSistemaDumpDisponibile()){
			String msg = "Sistema di dump dei contenuti applicativi non disponibile: "+Dump.getMotivoMalfunzionamentoDump().getMessage();
			sendError(res, log, msg, 500, Dump.getMotivoMalfunzionamentoDump()); 
			return;
		}
		
		if(properties.isCheckHealthCheckStatsEnabled()) {
			try {
				CheckStatoPdDHealthCheckStatsUtils.verificaInformazioniStatistiche(log, properties);
			}catch(Exception t) {
				String msg = "Statistics HealthCheck failed\n"+t.getMessage();
				sendError(res, log, msg, 500, t); 
				return;
			}
		}
		
		if(properties.isCheckHealthCheckApiRestEnabled()) {
			String endpoint = properties.getCheckHealthCheckApiRestEndpoint();
			
			HttpRequest request = new HttpRequest();
			if(endpoint.toLowerCase().startsWith("https")) {
				request.setHostnameVerifier(false);
				request.setTrustAllCerts(true);
			}
			request.setMethod(HttpRequestMethod.GET);
			request.setUrl(endpoint);
			
			try {
				HttpResponse response = HttpUtilities.httpInvoke(request);
				
				if(response.getResultHTTPOperation()!=200) {
					StringBuilder sb = new StringBuilder();
					if(response.getHeadersValues()!=null && !response.getHeadersValues().isEmpty()) {
						for (String hdrName : response.getHeadersValues().keySet()) {
							if(HttpConstants.RETURN_CODE.equals(hdrName)) {
								continue;
							}
							List<String> values = response.getHeaderValues(hdrName);
							if(values!=null && !values.isEmpty()) {
								for (String v : values) {
									sb.append("\n").append(hdrName).append(":").append(v);
								}
							}
						}
					}
					else {
						if(response.getContentType()!=null) {
							sb.append("\n").append(HttpConstants.CONTENT_TYPE).append(":").append(response.getContentType());	
						}
					}
					if(response.getContent()!=null) {
						sb.append("\n\n").append(new String(response.getContent()));
					}
					throw new CoreException("HTTP Result:"+response.getResultHTTPOperation()+sb.toString());
				}
				
			}catch(Exception t) {
				String msg = "API REST HealthCheck failed ("+endpoint+")\n"+t.getMessage();
				sendError(res, log, msg, 500, t); 
				return;
			}
		}
		
		if(properties.isCheckHealthCheckApiSoapEnabled()) {
			String endpoint = properties.getCheckHealthCheckApiSoapEndpoint();
			
			HttpRequest request = new HttpRequest();
			if(endpoint.toLowerCase().startsWith("https")) {
				request.setHostnameVerifier(false);
				request.setTrustAllCerts(true);
			}
			request.setContentType(HttpConstants.CONTENT_TYPE_SOAP_1_1);
			request.addHeader(HttpConstants.SOAP11_MANDATORY_HEADER_HTTP_SOAP_ACTION, "echo");
			request.setMethod(HttpRequestMethod.POST);
			request.setUrl(endpoint);
			request.setContent("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"><soapenv:Body><ns1:getStatus xmlns:ns1=\"https://govway.org/apiStatus\"/></soapenv:Body></soapenv:Envelope>".getBytes());
			
			try {
				HttpResponse response = HttpUtilities.httpInvoke(request);
				
				if(response.getResultHTTPOperation()!=200) {
					StringBuilder sb = new StringBuilder();
					if(response.getHeadersValues()!=null && !response.getHeadersValues().isEmpty()) {
						for (String hdrName : response.getHeadersValues().keySet()) {
							if(HttpConstants.RETURN_CODE.equals(hdrName)) {
								continue;
							}
							List<String> values = response.getHeaderValues(hdrName);
							if(values!=null && !values.isEmpty()) {
								for (String v : values) {
									sb.append("\n").append(hdrName).append(":").append(v);
								}
							}
						}
					}
					else {
						if(response.getContentType()!=null) {
							sb.append("\n").append(HttpConstants.CONTENT_TYPE).append(":").append(response.getContentType());
						}
					}
					if(response.getContent()!=null) {
						sb.append("\n\n").append(new String(response.getContent()));
					}
					throw new ServletException("HTTP Result:"+response.getResultHTTPOperation()+sb.toString());
				}
				
			}catch(Exception t) {
				String msg = "API SOAP HealthCheck failed ("+endpoint+")\n"+t.getMessage();
				sendError(res, log, msg, 500, t); 
			}
		}

	}
	
	private BooleanNullable readBooleanParam(HttpServletRequest req, String paramName) {
		String p = req.getParameter(paramName);
		if("true".equalsIgnoreCase(p)) {
			return BooleanNullable.TRUE();
		}
		else if("false".equalsIgnoreCase(p)) {
			return BooleanNullable.FALSE();
		}
		return BooleanNullable.NULL();
	}
	private Integer readIntegerParam(HttpServletRequest req, String paramName) {
		String p = req.getParameter(paramName);
		if(p!=null && StringUtils.isNotEmpty(p)) {
			return Integer.valueOf(p);
		}
		return null;
	}
	private CheckStatoPdDHealthCheckStats readHealthCheckStats(HttpServletRequest req, OpenSPCoop2Properties properties) {
		BooleanNullable healthCheckStats = readBooleanParam(req,CostantiPdD.CHECK_STATO_PDD_EXECUTE_HEALTH_CHECK_STATS);
		BooleanNullable hourlyHealthCheckStats = readBooleanParam(req,CostantiPdD.CHECK_STATO_PDD_EXECUTE_HOURLY_HEALTH_CHECK_STATS);
		BooleanNullable dailyHealthCheckStats = readBooleanParam(req,CostantiPdD.CHECK_STATO_PDD_EXECUTE_DAILY_HEALTH_CHECK_STATS);
		BooleanNullable weeklyHealthCheckStats = readBooleanParam(req,CostantiPdD.CHECK_STATO_PDD_EXECUTE_WEEKLY_HEALTH_CHECK_STATS);
		BooleanNullable monthlyHealthCheckStats = readBooleanParam(req,CostantiPdD.CHECK_STATO_PDD_EXECUTE_MONTHLY_HEALTH_CHECK_STATS);
		
		CheckStatoPdDHealthCheckStats check = null;
		if(hourlyHealthCheckStats!=null && hourlyHealthCheckStats.getValue()!=null) {
			check = new CheckStatoPdDHealthCheckStats();
			check.setVerificaStatisticaOraria(hourlyHealthCheckStats.getValue().booleanValue());
			Integer p = readIntegerParam(req, CostantiPdD.CHECK_STATO_PDD_EXECUTE_HOURLY_HEALTH_CHECK_STATS_THRESHOLD);
			if(p!=null && p.intValue()>=0) {
				check.setVerificaStatisticaOrariaSoglia(p.intValue());
			}
			else {
				check.setVerificaStatisticaOrariaSoglia(properties.getCheckHealthCheckStatsHourlyThreshold());
			}
		}
		if(dailyHealthCheckStats!=null && dailyHealthCheckStats.getValue()!=null) {
			if(check==null) {
				check = new CheckStatoPdDHealthCheckStats();
			}
			check.setVerificaStatisticaGiornaliera(dailyHealthCheckStats.getValue().booleanValue());
			Integer p = readIntegerParam(req, CostantiPdD.CHECK_STATO_PDD_EXECUTE_DAILY_HEALTH_CHECK_STATS_THRESHOLD);
			if(p!=null && p.intValue()>=0) {
				check.setVerificaStatisticaGiornalieraSoglia(p.intValue());
			}
			else {
				check.setVerificaStatisticaGiornalieraSoglia(properties.getCheckHealthCheckStatsDailyThreshold());
			}
		}
		if(weeklyHealthCheckStats!=null && weeklyHealthCheckStats.getValue()!=null) {
			if(check==null) {
				check = new CheckStatoPdDHealthCheckStats();
			}
			check.setVerificaStatisticaSettimanale(weeklyHealthCheckStats.getValue().booleanValue());
			Integer p = readIntegerParam(req, CostantiPdD.CHECK_STATO_PDD_EXECUTE_WEEKLY_HEALTH_CHECK_STATS_THRESHOLD);
			if(p!=null && p.intValue()>=0) {
				check.setVerificaStatisticaSettimanaleSoglia(p.intValue());
			}
			else {
				check.setVerificaStatisticaSettimanaleSoglia(properties.getCheckHealthCheckStatsWeeklyThreshold());
			}
		}
		if(monthlyHealthCheckStats!=null && monthlyHealthCheckStats.getValue()!=null) {
			if(check==null) {
				check = new CheckStatoPdDHealthCheckStats();
			}
			check.setVerificaStatisticaMensile(monthlyHealthCheckStats.getValue().booleanValue());
			Integer p = readIntegerParam(req, CostantiPdD.CHECK_STATO_PDD_EXECUTE_MONTHLY_HEALTH_CHECK_STATS_THRESHOLD);
			if(p!=null && p.intValue()>=0) {
				check.setVerificaStatisticaMensileSoglia(p.intValue());
			}
			else {
				check.setVerificaStatisticaMensileSoglia(properties.getCheckHealthCheckStatsMonthlyThreshold());
			}
		}
		if(check == null &&
			healthCheckStats!=null && healthCheckStats.getValue()!=null && healthCheckStats.getValue().booleanValue()) {
			check = CheckStatoPdDHealthCheckStats.readProprietaVerificaInformazioniStatistiche(properties);
		}
		
		return check;
	}
	

	private void addParameter(List<Object> params, List<String> signatures, HttpServletRequest req) throws CoreException {
		
		boolean add = addParameter(params, signatures, req,
				CostantiPdD.CHECK_STATO_PDD_PARAM_VALUE,
				CostantiPdD.CHECK_STATO_PDD_PARAM_INT_VALUE, 
				CostantiPdD.CHECK_STATO_PDD_PARAM_LONG_VALUE,
				CostantiPdD.CHECK_STATO_PDD_PARAM_BOOLEAN_VALUE);
		if(!add) {
			return;
		}
		
		add = addParameter(params, signatures, req,
				CostantiPdD.CHECK_STATO_PDD_PARAM_VALUE_2,
				CostantiPdD.CHECK_STATO_PDD_PARAM_INT_VALUE_2, 
				CostantiPdD.CHECK_STATO_PDD_PARAM_LONG_VALUE_2,
				CostantiPdD.CHECK_STATO_PDD_PARAM_BOOLEAN_VALUE_2);
		if(!add) {
			return;
		}
		
		add = addParameter(params, signatures, req,
				CostantiPdD.CHECK_STATO_PDD_PARAM_VALUE_3,
				CostantiPdD.CHECK_STATO_PDD_PARAM_INT_VALUE_3, 
				CostantiPdD.CHECK_STATO_PDD_PARAM_LONG_VALUE_3,
				CostantiPdD.CHECK_STATO_PDD_PARAM_BOOLEAN_VALUE_3);
		
		if(!add) {
			return;
		}
		
		addParameter(params, signatures, req,
				CostantiPdD.CHECK_STATO_PDD_PARAM_VALUE_4,
				CostantiPdD.CHECK_STATO_PDD_PARAM_INT_VALUE_4, 
				CostantiPdD.CHECK_STATO_PDD_PARAM_LONG_VALUE_4,
				CostantiPdD.CHECK_STATO_PDD_PARAM_BOOLEAN_VALUE_4);
			
	}
	
	private boolean addParameter(List<Object> params, List<String> signatures, HttpServletRequest req,
			String stringNameParameter, String intNameParameter, String longNameParameter, String booleanNameParameter) throws CoreException {
		
		int count = 0;
		List<String> pFound = new ArrayList<>();
		
		String paramStringValue = req.getParameter(stringNameParameter);
		boolean paramStringDefined = paramStringValue!=null && !"".equals(paramStringValue);
		if(paramStringDefined) {
			count++;
			pFound.add(stringNameParameter);
		}
		
		String paramIntValue = req.getParameter(intNameParameter);
		boolean paramIntDefined = paramIntValue!=null && !"".equals(paramIntValue);
		if(paramIntDefined) {
			count++;
			pFound.add(intNameParameter);
		}
		
		String paramLongValue = req.getParameter(longNameParameter);
		boolean paramLongDefined = paramLongValue!=null && !"".equals(paramLongValue);
		if(paramLongDefined) {
			count++;
			pFound.add(longNameParameter);
		}
		
		String paramBooleanValue = req.getParameter(booleanNameParameter);
		boolean paramBooleanDefined = paramBooleanValue!=null && !"".equals(paramBooleanValue);
		if(paramBooleanDefined) {
			count++;
			pFound.add(booleanNameParameter);
		}
		
		if(count==0) {
			return false;
		}
		if(count>1) {
			throw new CoreException("È stato fornito più di un tipo di parametro per la stessa posizione: "+pFound);
		}
		
		if(paramStringDefined){
			params.add(paramStringValue);
			signatures.add(String.class.getName());
		}
		else if(paramIntDefined){
			params.add(Integer.valueOf(paramIntValue));
			signatures.add(Integer.class.getName());
		}
		else if(paramLongDefined){
			params.add(Long.valueOf(paramLongValue));
			signatures.add(Long.class.getName());
		}
		/**else if(paramBooleanDefined){*/
		else {
			params.add(Boolean.valueOf(paramBooleanValue));
			signatures.add(Boolean.class.getName());
		}
		return true;
		
	}
}