ControlloTraffico.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.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.management.Attribute;
import javax.management.AttributeList;
import javax.management.AttributeNotFoundException;
import javax.management.DynamicMBean;
import javax.management.InvalidAttributeValueException;
import javax.management.JMException;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanConstructorInfo;
import javax.management.MBeanException;
import javax.management.MBeanInfo;
import javax.management.MBeanOperationInfo;
import javax.management.MBeanParameterInfo;
import javax.management.NotificationBroadcasterSupport;
import javax.management.ReflectionException;

import org.openspcoop2.core.config.constants.CostantiConfigurazione;
import org.openspcoop2.core.controllo_traffico.ConfigurazioneGenerale;
import org.openspcoop2.core.controllo_traffico.beans.JMXConstants;
import org.openspcoop2.core.controllo_traffico.driver.PolicyGroupByActiveThreadsType;
import org.openspcoop2.core.controllo_traffico.driver.PolicyNotFoundException;
import org.openspcoop2.core.controllo_traffico.driver.PolicyShutdownException;
import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
import org.openspcoop2.pdd.core.controllo_traffico.GestoreControlloTraffico;
import org.openspcoop2.pdd.core.controllo_traffico.policy.GestoreCacheControlloTraffico;
import org.openspcoop2.pdd.core.controllo_traffico.policy.driver.GestorePolicyAttive;
import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
import org.slf4j.Logger;


/**
 * Implementazione JMX per la gestione del Controllo del Traffico
 *   
 * @author Poli Andrea (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class ControlloTraffico extends NotificationBroadcasterSupport implements DynamicMBean {
		
	/** Attributi */
	private String statoControlloMaxThreads;
	public long maxThreads = 0;
	public long activeThreads = 0;
	public boolean pddCongestionata = false;

	// cache informazioni statistiche
	public boolean cacheAbilitata = false; 
	
	/** getAttribute */
	@Override
	public Object getAttribute(String attributeName) throws AttributeNotFoundException,MBeanException,ReflectionException{
		return _getAttribute(attributeName, true);
	}
	public Object _getAttribute(String attributeName, boolean refresh) throws AttributeNotFoundException,MBeanException,ReflectionException{
		
		if(refresh){
			this.refreshDati();
		}
		
		if( (attributeName==null) || (attributeName.equals("")) )
			throw new IllegalArgumentException("Il nome dell'attributo e' nullo o vuoto");
				
		if(attributeName.equals(JMXConstants.CC_ATTRIBUTE_MAX_THREADS_STATO))
			return this.statoControlloMaxThreads;
		
		if(attributeName.equals(JMXConstants.CC_ATTRIBUTE_MAX_THREADS_SOGLIA))
			return this.maxThreads;
		
		if(attributeName.equals(JMXConstants.CC_ATTRIBUTE_ACTIVE_THREADS))
			return this.activeThreads;
		
		if(attributeName.equals(JMXConstants.CC_ATTRIBUTE_PDD_CONGESTIONATA))
			return this.pddCongestionata;
				
		if(attributeName.equals(JMXUtils.CACHE_ATTRIBUTE_ABILITATA))
			return this.cacheAbilitata;
		
		throw new AttributeNotFoundException("Attributo "+attributeName+" non trovato");
	}
	
	/** getAttributes */
	@Override
	public AttributeList getAttributes(String [] attributesNames){
		
		try{
			this.refreshDati();
		}catch(Exception e){
			throw new RuntimeException(e.getMessage(),e);
		}
		
		if(attributesNames==null)
			throw new IllegalArgumentException("Array nullo");
		
		AttributeList list = new AttributeList();
		for (int i=0; i<attributesNames.length; i++){
			try{
				list.add(new Attribute(attributesNames[i],_getAttribute(attributesNames[i],false)));
			}catch(JMException ex){
				// ignore
			}
		}
		return list;
	}
	
	/** setAttribute */
	@Override
	public void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException{
		
		if( attribute==null )
			throw new IllegalArgumentException("Il nome dell'attributo e' nullo");
		
		try{
			
			if(attribute.getName().equals(JMXConstants.CC_ATTRIBUTE_MAX_THREADS_STATO)){
				this.statoControlloMaxThreads = (String) attribute.getValue();
			}
			
			if(attribute.getName().equals(JMXConstants.CC_ATTRIBUTE_MAX_THREADS_SOGLIA)){
				this.maxThreads = (Long) attribute.getValue();
			}
			
			if(attribute.getName().equals(JMXConstants.CC_ATTRIBUTE_ACTIVE_THREADS)){
				this.activeThreads = (Long) attribute.getValue();
			}
						
			if(attribute.getName().equals(JMXConstants.CC_ATTRIBUTE_PDD_CONGESTIONATA)){
				this.pddCongestionata = (Boolean) attribute.getValue();
			}
			
			if(attribute.getName().equals(JMXUtils.CACHE_ATTRIBUTE_ABILITATA)){
				boolean v = (Boolean) attribute.getValue();
				if(v){
					this.abilitaCache();
				}else{
					this.disabilitaCache();
				}
			}
			
			else
				throw new AttributeNotFoundException("Attributo "+attribute.getName()+" non trovato");
			
		}catch(ClassCastException ce){
			throw new InvalidAttributeValueException("il tipo "+attribute.getValue().getClass()+" dell'attributo "+attribute.getName()+" non e' valido");
		}catch(JMException j){
			throw new MBeanException(j);
		}
		
	}
	
	/** setAttributes */
	@Override
	public AttributeList setAttributes(AttributeList list){
		
		if(list==null)
			throw new IllegalArgumentException("Lista degli attributi e' nulla");
		
		AttributeList ret = new AttributeList();
		Iterator<?> it = ret.iterator();
		
		while(it.hasNext()){
			try{
				Attribute attribute = (Attribute) it.next();
				setAttribute(attribute);
				ret.add(attribute);
			}catch(JMException ex){
				// ignore
			}
		}
		
		return ret;
		
	}
	
	/** invoke */
	@Override
	public Object invoke(String actionName, Object[]params, String[]signature) throws MBeanException,ReflectionException{
		
		if( (actionName==null) || (actionName.equals("")) )
			throw new IllegalArgumentException("Nessuna operazione definita");
		
		
		// Policy
		
		if(actionName.equals(JMXConstants.CC_METHOD_NAME_GET_ALL_ID_POLICY)){
			return this.getAllIdPolicy();
		}
		
		if(actionName.equals(JMXConstants.CC_METHOD_NAME_GET_STATO_POLICY)){
			String param1 = null;
			if(params[0]!=null && !"".equals(params[0])){
				param1 = (String)params[0];
			}
			return this.getStatoPolicy(param1);
		}
		
		if(actionName.equals(JMXConstants.CC_METHOD_NAME_REMOVE_ALL_POLICY)){
			return this.removeAllPolicies();
		}
		
		if(actionName.equals(JMXConstants.CC_METHOD_NAME_RESET_ALL_POLICY_COUNTERS)){
			return this.resetAllPolicies();
		}
		
		if(actionName.equals(JMXConstants.CC_METHOD_NAME_REMOVE_POLICY)){
			String param1 = null;
			if(params[0]!=null && !"".equals(params[0])){
				param1 = (String)params[0];
			}
			return this.removePolicy(param1);
		}
		
		if(actionName.equals(JMXConstants.CC_METHOD_NAME_RESET_POLICY_COUNTERS)){
			String param1 = null;
			if(params[0]!=null && !"".equals(params[0])){
				param1 = (String)params[0];
			}
			return this.resetPolicy(param1);
		}
		
		
		// Cache Controllo del Traffico
		if(actionName.equals(JMXUtils.CACHE_METHOD_NAME_RESET)){
			return this.resetCache();
		}
		
		if(actionName.equals(JMXUtils.CACHE_METHOD_NAME_PRINT_STATS)){
			return this.printStatCache();
		}
				
		if(actionName.equals(JMXUtils.CACHE_METHOD_NAME_DISABILITA)){
			return this.disabilitaCacheConEsito();
		}
				
		if(actionName.equals(JMXUtils.CACHE_METHOD_NAME_ABILITA)){
			if(params.length != 4)
				throw new MBeanException(new Exception("[AbilitaCache] Lunghezza parametri non corretta: "+params.length));
			
			Long param1 = null;
			if(params[0]!=null && !"".equals(params[0])){
				param1 = (Long)params[0];
				if(param1<0){
					param1 = null;
				}
			}
			
			Boolean param2 = null;
			if(params[1]!=null && !"".equals(params[1])){
				param2 = (Boolean)params[1];
			}
			
			Long param3 = null;
			if(params[2]!=null && !"".equals(params[2])){
				param3 = (Long)params[2];
				if(param3<0){
					param3 = null;
				}
			}
			
			Long param4 = null;
			if(params[3]!=null && !"".equals(params[3])){
				param4 = (Long)params[3];
				if(param4<0){
					param4 = null;
				}
			}
					
			return this.abilitaCache(param1, param2, param3, param4 );
		}
		
		if(actionName.equals(JMXUtils.CACHE_METHOD_NAME_LIST_KEYS)){
			return this.listKeysCache();
		}
		
		if(actionName.equals(JMXUtils.CACHE_METHOD_NAME_GET_OBJECT)){
			
			if(params.length != 1)
				throw new MBeanException(new Exception("["+JMXUtils.CACHE_METHOD_NAME_GET_OBJECT+"] Lunghezza parametri non corretta: "+params.length));
			
			String param1 = null;
			if(params[0]!=null && !"".equals(params[0])){
				param1 = (String)params[0];
			}
			
			return this.getObjectCache(param1);
		}
		
		if(actionName.equals(JMXUtils.CACHE_METHOD_NAME_REMOVE_OBJECT)){
			
			if(params.length != 1)
				throw new MBeanException(new Exception("["+JMXUtils.CACHE_METHOD_NAME_REMOVE_OBJECT+"] Lunghezza parametri non corretta: "+params.length));
			
			String param1 = null;
			if(params[0]!=null && !"".equals(params[0])){
				param1 = (String)params[0];
			}
			
			return this.removeObjectCache(param1);
		}
				
		throw new UnsupportedOperationException("Operazione "+actionName+" sconosciuta");
	}
	
	/* MBean info */
	@Override
	public MBeanInfo getMBeanInfo(){
				
		// Descrizione della classe nel MBean
		String className = this.getClass().getName();
		String description = "Risorsa per la gestione del Controllo del Traffico ("+OpenSPCoop2Properties.getInstance().getVersione()+")";
		
		// *** Attributi ***
		
		// MetaData per l'attributo maxThreads (stato)
		MBeanAttributeInfo maxThreadsStatoVAR = new MBeanAttributeInfo(JMXConstants.CC_ATTRIBUTE_MAX_THREADS_STATO,String.class.getName(),
						"Stato del controllo sul numero massimo di threads attivi",
						JMXUtils.JMX_ATTRIBUTE_READABLE,!JMXUtils.JMX_ATTRIBUTE_WRITABLE,!JMXUtils.JMX_ATTRIBUTE_IS_GETTER);
		
		// MetaData per l'attributo maxThreads (soglia)
		MBeanAttributeInfo maxThreadsSogliaVAR = new MBeanAttributeInfo(JMXConstants.CC_ATTRIBUTE_MAX_THREADS_SOGLIA,long.class.getName(),
						"Numero massimo di threads attivi",
						JMXUtils.JMX_ATTRIBUTE_READABLE,!JMXUtils.JMX_ATTRIBUTE_WRITABLE,!JMXUtils.JMX_ATTRIBUTE_IS_GETTER);
		
		// MetaData per l'attributo activeThreads
		MBeanAttributeInfo activeThreadsVAR = new MBeanAttributeInfo(JMXConstants.CC_ATTRIBUTE_ACTIVE_THREADS,long.class.getName(),
						"Numero di threads attivi",
						JMXUtils.JMX_ATTRIBUTE_READABLE,!JMXUtils.JMX_ATTRIBUTE_WRITABLE,!JMXUtils.JMX_ATTRIBUTE_IS_GETTER);
		
		// MetaData per l'attributo pddCongestionata
		MBeanAttributeInfo pddCongestionataVAR = new MBeanAttributeInfo(JMXConstants.CC_ATTRIBUTE_PDD_CONGESTIONATA,boolean.class.getName(),
						"Indicazione se la PdD risulta congestionata dalle richieste",
						JMXUtils.JMX_ATTRIBUTE_READABLE,!JMXUtils.JMX_ATTRIBUTE_WRITABLE,!JMXUtils.JMX_ATTRIBUTE_IS_GETTER);
		
		
		// MetaData per l'attributo abilitaCache
		MBeanAttributeInfo cacheAbilitataVAR = JMXUtils.MBEAN_ATTRIBUTE_INFO_CACHE_ABILITATA;
		
		// *** Operazioni ***
		
		// MetaData per l'operazione  getAllIdPolicy
		MBeanOperationInfo getAllIdPolicyOP = new MBeanOperationInfo(JMXConstants.CC_METHOD_NAME_GET_ALL_ID_POLICY,
				"Ritorna gli identificativi delle policy attivate tramite Rate Limiting",
				null,
				//new MBeanParameterInfo[]{new MBeanParameterInfo("param",String.class.getName())}
				String.class.getName(),
				MBeanOperationInfo.ACTION);
		
		// MetaData per l'operazione  getStatoThreadsAttiviPortaDelegata
		MBeanOperationInfo getStatoPolicyOP = new MBeanOperationInfo(JMXConstants.CC_METHOD_NAME_GET_STATO_POLICY,
				"Ritorna lo stato della policy identificata dal parametro",
				new MBeanParameterInfo[]{new MBeanParameterInfo("id",String.class.getName(),"identificativo della policy")},
				String.class.getName(),
				MBeanOperationInfo.ACTION);
		
		// MetaData per l'operazione  removeAllPolicies
		MBeanOperationInfo removeAllPoliciesOP = new MBeanOperationInfo(JMXConstants.CC_METHOD_NAME_REMOVE_ALL_POLICY,
				"Elimina le istanza attive di tutte le policy",
				null,
				//new MBeanParameterInfo[]{new MBeanParameterInfo("param",String.class.getName())}
				String.class.getName(),
				MBeanOperationInfo.ACTION);
		
		// MetaData per l'operazione  removePolicy
		MBeanOperationInfo removePolicyOP = new MBeanOperationInfo(JMXConstants.CC_METHOD_NAME_REMOVE_POLICY,
				"Elimina l'istanza attiva della policy di Rate Limiting identificata dal parametro",
				new MBeanParameterInfo[]{new MBeanParameterInfo("id",String.class.getName(),"identificativo della policy")},
				String.class.getName(),
				MBeanOperationInfo.ACTION);
		
		// MetaData per l'operazione  removeAllPolicies
		MBeanOperationInfo resetAllPoliciesOP = new MBeanOperationInfo(JMXConstants.CC_METHOD_NAME_RESET_ALL_POLICY_COUNTERS,
				"Effettua i reset dei contatori di tutte le policy attivate tramite Rate Limiting",
				null,
				//new MBeanParameterInfo[]{new MBeanParameterInfo("param",String.class.getName())}
				String.class.getName(),
				MBeanOperationInfo.ACTION);
		
		// MetaData per l'operazione  removePolicy
		MBeanOperationInfo resetPolicyOP = new MBeanOperationInfo(JMXConstants.CC_METHOD_NAME_RESET_POLICY_COUNTERS,
				"Effettua i reset dei contatori presenti nella policy di Rate Limiting identificata dal parametro",
				new MBeanParameterInfo[]{new MBeanParameterInfo("id",String.class.getName(),"identificativo della policy")},
				String.class.getName(),
				MBeanOperationInfo.ACTION);
		
		// MetaData per l'operazione resetCache
		MBeanOperationInfo resetCacheOP = JMXUtils.MBEAN_OPERATION_RESET_CACHE;
		
		// MetaData per l'operazione printStatCache
		MBeanOperationInfo printStatCacheOP = JMXUtils.MBEAN_OPERATION_PRINT_STATS_CACHE;
		
		// MetaData per l'operazione disabilitaCache
		MBeanOperationInfo disabilitaCacheOP = JMXUtils.MBEAN_OPERATION_DISABILITA_CACHE;
		
		// MetaData per l'operazione abilitaCache con parametri
		MBeanOperationInfo abilitaCacheParametriOP = JMXUtils.MBEAN_OPERATION_ABILITA_CACHE_CON_PARAMETRI;
		
		// MetaData per l'operazione listKeysCache
		MBeanOperationInfo listKeysCacheOP = JMXUtils.MBEAN_OPERATION_LIST_KEYS_CACHE; 

		// MetaData per l'operazione getObjectCache
		MBeanOperationInfo getObjectCacheOP = JMXUtils.MBEAN_OPERATION_GET_OBJECT_CACHE;
		
		// MetaData per l'operazione removeObjectCache
		MBeanOperationInfo removeObjectCacheOP = JMXUtils.MBEAN_OPERATION_REMOVE_OBJECT_CACHE;
		
		
		// *** Costruttore ***
		
		// Mbean costruttore
		MBeanConstructorInfo defaultConstructor = new MBeanConstructorInfo("Default Constructor","Crea e inizializza una nuova istanza del MBean",null);

		// Lista attributi
		MBeanAttributeInfo[] attributes = new MBeanAttributeInfo[]{maxThreadsStatoVAR, maxThreadsSogliaVAR, activeThreadsVAR, 
				pddCongestionataVAR, 
				cacheAbilitataVAR};
		
		// Lista Costruttori
		MBeanConstructorInfo[] constructors = new MBeanConstructorInfo[]{defaultConstructor};
		
		// Lista operazioni
		MBeanOperationInfo[] operations = new MBeanOperationInfo[]{
				getAllIdPolicyOP, getStatoPolicyOP, removeAllPoliciesOP, removePolicyOP, resetAllPoliciesOP, resetPolicyOP,
				resetCacheOP,printStatCacheOP,disabilitaCacheOP,abilitaCacheParametriOP,listKeysCacheOP,getObjectCacheOP,removeObjectCacheOP};
		
		return new MBeanInfo(className,description,attributes,constructors,operations,null);
	}
	
	/* Variabili per la gestione JMX */
	private Logger log;
	private GestoreControlloTraffico gestoreControlloTraffico;
	
	/* Costruttore */
	public ControlloTraffico() throws Exception{

		boolean force = true;
		this.log = OpenSPCoop2Logger.getLoggerOpenSPCoopControlloTraffico(force);  // per gli errori
		
		this.refreshDati();
		
		this.cacheAbilitata = GestoreCacheControlloTraffico.isCacheAbilitata();
			
		
	}
	
	private void refreshDati() throws MBeanException{
		ConfigurazioneGenerale configurazioneGenerale = null;
		try{
		
			ConfigurazionePdDManager configPdDManager = ConfigurazionePdDManager.getInstance();
			configurazioneGenerale = configPdDManager.getConfigurazioneControlloTraffico(null);
			
			if(configurazioneGenerale.getControlloTraffico().isControlloMaxThreadsEnabled()) {
				if(configurazioneGenerale.getControlloTraffico().isControlloMaxThreadsWarningOnly()) {
					this.statoControlloMaxThreads = CostantiConfigurazione.STATO_CON_WARNING_WARNING_ONLY.getValue();
				}
				else {
					this.statoControlloMaxThreads = CostantiConfigurazione.STATO_CON_WARNING_ABILITATO.getValue();
				}
			}
			else {
				this.statoControlloMaxThreads = CostantiConfigurazione.STATO_CON_WARNING_DISABILITATO.getValue();
			}
			
			this.maxThreads = configurazioneGenerale.getControlloTraffico().getControlloMaxThreadsSoglia();
		
			this.gestoreControlloTraffico = GestoreControlloTraffico.getInstance();
			this.activeThreads = this.gestoreControlloTraffico.sizeActiveThreads();
			
			this.pddCongestionata = this.gestoreControlloTraffico.isPortaDominioCongestionata(this.maxThreads,configurazioneGenerale.getControlloTraffico().getControlloCongestioneThreshold());
			
		}catch(Exception e){
			try{
				this.log.error("Configurazione non disponibile: "+e.getMessage(),e);
			}catch(Exception eLog){
				// ignore
			}
			throw new MBeanException(e, "Configurazione non disponibile: "+e.getMessage());
		}
	}
	
	
	public boolean isCacheAbilitata() {
		return this.cacheAbilitata;
	}
	
	/* Metodi di management JMX */

	public String getAllIdPolicy(){
		try{
			List<PolicyGroupByActiveThreadsType> tipiGestorePolicyAttivi = GestorePolicyAttive.getTipiGestoriAttivi();
			if(tipiGestorePolicyAttivi==null || tipiGestorePolicyAttivi.isEmpty()) {
				throw new Exception("GestorePolicyAttive non abilitato");
			}
			StringBuilder sb = new StringBuilder();
			for (PolicyGroupByActiveThreadsType type : tipiGestorePolicyAttivi) {
				String p = GestorePolicyAttive.getInstance(type).printKeysPolicy("\n");
				if(sb.length()>0) {
					sb.append("\n");
				}
				sb.append(p);
			}
			return sb.toString();
			
		}catch(PolicyShutdownException notFound){
			return "GestorePolicyAttive in shutdown; controllare lo stato di GovWay";
		}catch(Throwable e){
			this.log.error(JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage(),e);
			return JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage();
		}
	}
	
	public String getStatoPolicy(String id){
		try{
			List<PolicyGroupByActiveThreadsType> tipiGestorePolicyAttivi = GestorePolicyAttive.getTipiGestoriAttivi();
			if(tipiGestorePolicyAttivi==null || tipiGestorePolicyAttivi.isEmpty()) {
				throw new Exception("GestorePolicyAttive non abilitato");
			}
			if(id==null)
				throw new Exception("Parametro non fornito");
			try{
				Map<PolicyGroupByActiveThreadsType, String> infos = new HashMap<PolicyGroupByActiveThreadsType, String>();
				PolicyNotFoundException notFound = null;
				for (PolicyGroupByActiveThreadsType type : tipiGestorePolicyAttivi) {
					try {
						infos.put(type, GestorePolicyAttive.getInstance(type).printInfoPolicy(id, "================================================================"));			
					}catch(PolicyNotFoundException notFoundE){
						notFound = notFoundE;
					}
				}
				if(infos.isEmpty()) {
					if(notFound!=null) {
						throw notFound;
					}
					else {
						throw new PolicyNotFoundException();
					}
				}
				else if(infos.size()==1) {
					return infos.get(infos.keySet().iterator().next());
				}
				else {
					StringBuilder sb = new StringBuilder();
					for (PolicyGroupByActiveThreadsType policyGroupByActiveThreadsType : infos.keySet()) {
						if(sb.length()>0) {
							sb.append("\n\n");
						}
						sb.append("*** Gestore '").append(policyGroupByActiveThreadsType.name()).append("' ***\n");
						sb.append(infos.get(policyGroupByActiveThreadsType));
					}
					return sb.toString();
				}
			}catch(PolicyNotFoundException notFound){
				return "Informazioni sulla Policy non disponibili; non sono ancora transitate richieste che soddisfano i criteri di filtro impostati";
			}catch(PolicyShutdownException notFound){
				return "GestorePolicyAttive in shutdown; controllare lo stato di GovWay";
			}
		}catch(Throwable e){
			this.log.error(JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage(),e);
			return JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage();
		}
	}
	
	public String removeAllPolicies(){
		try{
			List<PolicyGroupByActiveThreadsType> tipiGestorePolicyAttivi = GestorePolicyAttive.getTipiGestoriAttivi();
			if(tipiGestorePolicyAttivi==null || tipiGestorePolicyAttivi.isEmpty()) {
				throw new Exception("GestorePolicyAttive non abilitato");
			}
			for (PolicyGroupByActiveThreadsType type : tipiGestorePolicyAttivi) {
				GestorePolicyAttive.getInstance(type).removeAllActiveThreadsPolicy();
			}
			return "Operazione 'remove' effettuata con successo";
		}catch(PolicyShutdownException notFound){
			return "GestorePolicyAttive in shutdown; controllare lo stato di GovWay";
		}catch(Throwable e){
			this.log.error(JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage(),e);
			return JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage();
		}
	}
	
	public String resetAllPolicies(){
		try{
			List<PolicyGroupByActiveThreadsType> tipiGestorePolicyAttivi = GestorePolicyAttive.getTipiGestoriAttivi();
			if(tipiGestorePolicyAttivi==null || tipiGestorePolicyAttivi.isEmpty()) {
				throw new Exception("GestorePolicyAttive non abilitato");
			}
			for (PolicyGroupByActiveThreadsType type : tipiGestorePolicyAttivi) {
				GestorePolicyAttive.getInstance(type).resetCountersAllActiveThreadsPolicy();
			}
			return JMXUtils.MSG_RESET_CACHE_EFFETTUATO_SUCCESSO;
		}catch(PolicyShutdownException notFound){
			return "GestorePolicyAttive in shutdown; controllare lo stato di GovWay";
		}catch(Throwable e){
			this.log.error(JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage(),e);
			return JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage();
		}
	}
	
	public String removePolicy(String id){
		try{
			List<PolicyGroupByActiveThreadsType> tipiGestorePolicyAttivi = GestorePolicyAttive.getTipiGestoriAttivi();
			if(tipiGestorePolicyAttivi==null || tipiGestorePolicyAttivi.isEmpty()) {
				throw new Exception("GestorePolicyAttive non abilitato");
			}
			if(id==null)
				throw new Exception("Parametro non fornito");
			for (PolicyGroupByActiveThreadsType type : tipiGestorePolicyAttivi) {
				GestorePolicyAttive.getInstance(type).removeActiveThreadsPolicy(id);
			}
			return "Operazione 'remove' effettuata con successo";
		}catch(PolicyShutdownException notFound){
			return "GestorePolicyAttive in shutdown; controllare lo stato di GovWay";
		}catch(Throwable e){
			this.log.error(JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage(),e);
			return JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage();
		}
	}
	
	public String resetPolicy(String id){
		try{
			List<PolicyGroupByActiveThreadsType> tipiGestorePolicyAttivi = GestorePolicyAttive.getTipiGestoriAttivi();
			if(tipiGestorePolicyAttivi==null || tipiGestorePolicyAttivi.isEmpty()) {
				throw new Exception("GestorePolicyAttive non abilitato");
			}
			if(id==null)
				throw new Exception("Parametro non fornito");
			for (PolicyGroupByActiveThreadsType type : tipiGestorePolicyAttivi) {
				GestorePolicyAttive.getInstance(type).resetCountersActiveThreadsPolicy(id);
			}
			return JMXUtils.MSG_RESET_CACHE_EFFETTUATO_SUCCESSO;
		}catch(PolicyShutdownException notFound){
			return "GestorePolicyAttive in shutdown; controllare lo stato di GovWay";
		}catch(Throwable e){
			this.log.error(JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage(),e);
			return JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage();
		}
	}
	
	public String resetCache(){
		try{
			if(this.cacheAbilitata==false)
				throw new Exception("Cache non abilitata");
			GestoreCacheControlloTraffico.resetCache();
			return JMXUtils.MSG_RESET_CACHE_EFFETTUATO_SUCCESSO;
		}catch(Throwable e){
			this.log.error(JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage(),e);
			return JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage();
		}
	}
	
	public String printStatCache(){
		try{
			if(this.cacheAbilitata==false)
				throw new Exception("Cache non abilitata");
			return GestoreCacheControlloTraffico.printStatsCache("\n");
		}catch(Throwable e){
			this.log.error(JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage(),e);
			return JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage();
		}
	}
	
	public void abilitaCache() throws JMException{
		try{
			GestoreCacheControlloTraffico.abilitaCache();
			this.cacheAbilitata = true;
		}catch(Throwable e){
			this.log.error(e.getMessage(),e);
		}
	}
	
	public String abilitaCache(Long dimensioneCache,Boolean algoritmoCacheLRU,Long itemIdleTime,Long itemLifeSecond){
		try{
			GestoreCacheControlloTraffico.abilitaCache(dimensioneCache,algoritmoCacheLRU,itemIdleTime,itemLifeSecond,this.log);
			this.cacheAbilitata = true;
			return JMXUtils.MSG_ABILITAZIONE_CACHE_EFFETTUATA;
		}catch(Throwable e){
			this.log.error(e.getMessage(),e);
			return JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage();
		}
	}
		
	
	public void disabilitaCache() throws JMException{
		try{
			GestoreCacheControlloTraffico.disabilitaCache();
			this.cacheAbilitata = false;
		}catch(Throwable e){
			this.log.error(e.getMessage(),e);
			throw new JMException(e.getMessage());
		}
	}
	public String disabilitaCacheConEsito() {
		try{
			disabilitaCache();
			return JMXUtils.MSG_DISABILITAZIONE_CACHE_EFFETTUATA;
		}catch(Throwable e){
			this.log.error(e.getMessage(),e);
			return JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage();
		}
	}
	
	public String listKeysCache(){
		try{
			if(this.cacheAbilitata==false)
				throw new Exception("Cache non abilitata");
			return GestoreCacheControlloTraffico.listKeysCache("\n");
		}catch(Throwable e){
			this.log.error(JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage(),e);
			return JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage();
		}
	}
	
	public String getObjectCache(String key){
		try{
			if(this.cacheAbilitata==false)
				throw new Exception("Cache non abilitata");
			return GestoreCacheControlloTraffico.getObjectCache(key);
		}catch(Throwable e){
			this.log.error(JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage(),e);
			return JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage();
		}
	}
	
	public String removeObjectCache(String key){
		try{
			if(this.cacheAbilitata==false)
				throw new Exception("Cache non abilitata");
			GestoreCacheControlloTraffico.removeObjectCache(key);
			return JMXUtils.MSG_RIMOZIONE_CACHE_EFFETTUATA;
		}catch(Throwable e){
			this.log.error(JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage(),e);
			return JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA+e.getMessage();
		}
	}

}