AllarmiDriverUtils.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.core.allarmi.utils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.openspcoop2.core.allarmi.Allarme;
import org.openspcoop2.core.allarmi.AllarmeHistory;
import org.openspcoop2.core.allarmi.IdAllarme;
import org.openspcoop2.core.allarmi.constants.RuoloPorta;
import org.openspcoop2.core.allarmi.constants.StatoAllarme;
import org.openspcoop2.core.allarmi.constants.TipoAllarme;
import org.openspcoop2.core.allarmi.dao.IAllarmeHistoryService;
import org.openspcoop2.core.allarmi.dao.IAllarmeHistoryServiceSearch;
import org.openspcoop2.core.allarmi.dao.IAllarmeService;
import org.openspcoop2.core.allarmi.dao.IAllarmeServiceSearch;
import org.openspcoop2.core.allarmi.dao.jdbc.JDBCServiceManager;
import org.openspcoop2.core.allarmi.dao.jdbc.converter.AllarmeFieldConverter;
import org.openspcoop2.core.allarmi.dao.jdbc.converter.AllarmeHistoryFieldConverter;
import org.openspcoop2.core.commons.Filtri;
import org.openspcoop2.core.commons.ISearch;
import org.openspcoop2.core.commons.Liste;
import org.openspcoop2.core.commons.SearchUtils;
import org.openspcoop2.core.config.constants.CostantiConfigurazione;
import org.openspcoop2.core.constants.CostantiDB;
import org.openspcoop2.core.id.IDServizio;
import org.openspcoop2.core.id.IDServizioApplicativo;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.generic_project.beans.CustomField;
import org.openspcoop2.generic_project.beans.Function;
import org.openspcoop2.generic_project.beans.FunctionField;
import org.openspcoop2.generic_project.beans.NonNegativeNumber;
import org.openspcoop2.generic_project.exception.NotFoundException;
import org.openspcoop2.generic_project.exception.ServiceException;
import org.openspcoop2.generic_project.expression.IExpression;
import org.openspcoop2.generic_project.expression.IPaginatedExpression;
import org.openspcoop2.generic_project.expression.LikeMode;
import org.openspcoop2.generic_project.expression.SortOrder;
import org.openspcoop2.generic_project.utils.ServiceManagerProperties;
import org.openspcoop2.utils.sql.ISQLQueryObject;
import org.openspcoop2.utils.sql.LikeConfig;
import org.openspcoop2.utils.sql.SQLObjectFactory;
import org.slf4j.Logger;

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

	public static List<Allarme> allarmiList(ISearch ricerca, RuoloPorta ruoloPorta, String nomePorta, Connection con, Logger log, String tipoDB) throws ServiceException {
		String nomeMetodo = "allarmiList";
		int idLista = Liste.CONFIGURAZIONE_ALLARMI;
		int offset;
		int limit;
		String search;

		limit = ricerca.getPageSize(idLista);
		offset = ricerca.getIndexIniziale(idLista);
		search = (org.openspcoop2.core.constants.Costanti.SESSION_ATTRIBUTE_VALUE_RICERCA_UNDEFINED.equals(ricerca.getSearchString(idLista)) ? "" : ricerca.getSearchString(idLista));

		String filterStato = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_STATO);
		
		log.debug("search : " + search);
		log.debug("filterStato : " + filterStato);
				
		try {
			ServiceManagerProperties properties = new ServiceManagerProperties();
			properties.setDatabaseType(tipoDB);
			properties.setShowSql(true);
			JDBCServiceManager jdbcServiceManager = new JDBCServiceManager(con, properties, log);
			
			IAllarmeServiceSearch allarmiServiceSearch = jdbcServiceManager.getAllarmeServiceSearch();
			
			IExpression expr = allarmiServiceSearch.newExpression();
			
			boolean addAnd = false;
			
			if(ruoloPorta!=null && nomePorta!=null) {
				expr.equals(Allarme.model().FILTRO.RUOLO_PORTA, ruoloPorta.getValue()).and().equals(Allarme.model().FILTRO.NOME_PORTA, nomePorta);
				addAnd = true;
			}
			else {
				expr.isNull(Allarme.model().FILTRO.NOME_PORTA);
				addAnd = true;
			}
			
			if (!search.equals("")) {
				if(addAnd)
					expr.and();
				
				expr.ilike(Allarme.model().ALIAS, search, LikeMode.ANYWHERE);
				
				addAnd = true;
			}
			
			if (filterStato!=null && !filterStato.equals("")) {
				if(addAnd)
					expr.and();
				
				if(Filtri.FILTRO_STATO_VALORE_ABILITATO.equals(filterStato)) {
					expr.equals(Allarme.model().ENABLED, 1);
					addAnd = true;
				}
				else if(Filtri.FILTRO_STATO_VALORE_DISABILITATO.equals(filterStato)) {
					expr.equals(Allarme.model().ENABLED, 0);
					addAnd = true;
				}
				else if(Filtri.FILTRO_STATO_VALORE_OK.equals(filterStato)) {
					expr.equals(Allarme.model().ENABLED, 1);
					expr.and();
					expr.equals(Allarme.model().STATO, AllarmiConverterUtils.toIntegerValue(StatoAllarme.OK));
					addAnd = true;
				}
				else if(Filtri.FILTRO_STATO_VALORE_WARNING.equals(filterStato)) {
					expr.equals(Allarme.model().ENABLED, 1);
					expr.and();
					expr.equals(Allarme.model().STATO, AllarmiConverterUtils.toIntegerValue(StatoAllarme.WARNING));
					addAnd = true;
				}
				else if(Filtri.FILTRO_STATO_VALORE_ERROR.equals(filterStato)) {
					expr.equals(Allarme.model().ENABLED, 1);
					expr.and();
					expr.equals(Allarme.model().STATO, AllarmiConverterUtils.toIntegerValue(StatoAllarme.ERROR));
					addAnd = true;
				}
				
				addAnd = true;
			}
			
			NonNegativeNumber count = allarmiServiceSearch.count(expr);
			ricerca.setNumEntries(idLista,(int) count.longValue());
			
			// ricavo le entries
			if (limit == 0) // con limit
				limit = ISQLQueryObject.LIMIT_DEFAULT_VALUE;
			
			IPaginatedExpression pagExpr = allarmiServiceSearch.toPaginatedExpression(expr);
			
			pagExpr.limit(limit).offset(offset);
			pagExpr.addOrder(Allarme.model().ALIAS, SortOrder.ASC);

			return allarmiServiceSearch.findAll(pagExpr);
			
		} catch (Exception qe) {
			throw new ServiceException("[" + nomeMetodo + "] Errore : " + qe.getMessage(),qe);
		} 
	}
	
	
	public static void createAllarme(Allarme allarme, Connection con, Logger log, String tipoDB) throws ServiceException {
		String nomeMetodo = "createAllarme";

		try {
			ServiceManagerProperties properties = new ServiceManagerProperties();
			properties.setDatabaseType(tipoDB);
			properties.setShowSql(true);
			JDBCServiceManager jdbcServiceManager = new JDBCServiceManager(con, properties, log);
			
			IAllarmeService allarmiService = jdbcServiceManager.getAllarmeService();
			
			allarmiService.create(allarme);
			
		} catch (Exception qe) {
			throw new ServiceException("[DriverConfigurazioneDB::" + nomeMetodo + "] Errore : " + qe.getMessage(),qe);
		}
	}
	
	public static void updateAllarme(Allarme allarme, Connection con, Logger log, String tipoDB) throws ServiceException {
		String nomeMetodo = "updateAllarme";

		try {
			ServiceManagerProperties properties = new ServiceManagerProperties();
			properties.setDatabaseType(tipoDB);
			properties.setShowSql(true);
			JDBCServiceManager jdbcServiceManager = new JDBCServiceManager(con, properties, log);
			
			IAllarmeService allarmiService = jdbcServiceManager.getAllarmeService();
			
			IdAllarme idAll = new IdAllarme();
			idAll.setNome(allarme.getNome());
			allarmiService.update(idAll,allarme);
			
		} catch (Exception qe) {
			throw new ServiceException("[DriverConfigurazioneDB::" + nomeMetodo + "] Errore : " + qe.getMessage(),qe);
		}
	}
	
	public static void deleteAllarme(Allarme allarme, Connection con, Logger log, String tipoDB) throws ServiceException {
		String nomeMetodo = "deleteAllarme";

		try {
			ServiceManagerProperties properties = new ServiceManagerProperties();
			properties.setDatabaseType(tipoDB);
			properties.setShowSql(true);
			JDBCServiceManager jdbcServiceManager = new JDBCServiceManager(con, properties, log);
			
			IAllarmeService allarmiService = jdbcServiceManager.getAllarmeService();
			
			allarmiService.delete(allarme);
			
		} catch (Exception qe) {
			throw new ServiceException("[DriverConfigurazioneDB::" + nomeMetodo + "] Errore : " + qe.getMessage(),qe);
		} 
	}

	public static boolean existsAllarme(String nome, Connection con, Logger log, String tipoDB) throws ServiceException {
		String nomeMetodo = "existsAllarme";
		
		try {
			ServiceManagerProperties properties = new ServiceManagerProperties();
			properties.setDatabaseType(tipoDB);
			properties.setShowSql(true);
			JDBCServiceManager jdbcServiceManager = new JDBCServiceManager(con, properties, log);
			
			IAllarmeServiceSearch allarmiServiceSearch = jdbcServiceManager.getAllarmeServiceSearch();
			
			IExpression expr = allarmiServiceSearch.newExpression();
			
			expr.equals(Allarme.model().NOME, nome);
			
			NonNegativeNumber count = allarmiServiceSearch.count(expr);
			
			return count.longValue() > 0;
		} catch (Exception qe) {
			throw new ServiceException("[DriverConfigurazioneDB::" + nomeMetodo + "] Errore : " + qe.getMessage(),qe);
		} 
	}
	
	public static Allarme getAllarme(String nome, Connection con, Logger log, String tipoDB) throws ServiceException {
		String nomeMetodo = "getAllarmeByNome";
		
		try {
			ServiceManagerProperties properties = new ServiceManagerProperties();
			properties.setDatabaseType(tipoDB);
			properties.setShowSql(true);
			JDBCServiceManager jdbcServiceManager = new JDBCServiceManager(con, properties, log);
			
			IAllarmeServiceSearch allarmiServiceSearch = jdbcServiceManager.getAllarmeServiceSearch();
			
			IdAllarme id = new IdAllarme();
			id.setNome(nome);
			
			return allarmiServiceSearch.get(id);
			
		} catch (Exception qe) {
			throw new ServiceException("[DriverConfigurazioneDB::" + nomeMetodo + "] Errore : " + qe.getMessage(),qe);
		}
	}
	
	public static Allarme getAllarme(Long id, Connection con, Logger log, String tipoDB) throws ServiceException {
		String nomeMetodo = "getAllarme";
		
		try {
			ServiceManagerProperties properties = new ServiceManagerProperties();
			properties.setDatabaseType(tipoDB);
			properties.setShowSql(true);
			JDBCServiceManager jdbcServiceManager = new JDBCServiceManager(con, properties, log);
			
			IAllarmeServiceSearch allarmiServiceSearch = jdbcServiceManager.getAllarmeServiceSearch();
			
			IExpression expr = allarmiServiceSearch.newExpression();
			
			AllarmeFieldConverter converter = new AllarmeFieldConverter(tipoDB);
			expr.equals(new CustomField("id", Long.class, "id", converter.toTable(Allarme.model())), id);
			
			return allarmiServiceSearch.find(expr);
			
		} catch (Exception qe) {
			throw new ServiceException("[DriverConfigurazioneDB::" + nomeMetodo + "] Errore : " + qe.getMessage(),qe);
		}
	}
	
	public static Allarme getAllarmeByAlias(String alias,
			RuoloPorta ruoloPorta, String nomePorta, Connection con, Logger log, String tipoDB) throws ServiceException,NotFoundException{
		String nomeMetodo = "getAllarmeByAlias"; 
		
		try{
			ServiceManagerProperties properties = new ServiceManagerProperties();
			properties.setDatabaseType(tipoDB);
			properties.setShowSql(true);
			JDBCServiceManager serviceManager = new JDBCServiceManager(con, properties, log);
			IExpression expression = serviceManager.getAllarmeServiceSearch().newExpression();
			
			expression.and();
			expression.ilike(Allarme.model().ALIAS, alias, LikeMode.EXACT);
			
			if(ruoloPorta!=null && nomePorta!=null) {
				expression.equals(Allarme.model().FILTRO.ENABLED, true);
				expression.equals(Allarme.model().FILTRO.RUOLO_PORTA, ruoloPorta);
				expression.equals(Allarme.model().FILTRO.NOME_PORTA, nomePorta);
			}
			else {
				expression.isNull(Allarme.model().FILTRO.NOME_PORTA);
			}
		
			return serviceManager.getAllarmeServiceSearch().find(expression);
		}catch (NotFoundException e) {
			throw new NotFoundException("[" + nomeMetodo + "] Allarme non presente.");
		} catch (Exception qe) {
			throw new ServiceException("[" + nomeMetodo +"] Errore : " + qe.getMessage(),qe);
		} 
	}
	
	public static boolean existsAllarmi(TipoAllarme tipoAllarme, Connection con, Logger log, String tipoDB) throws ServiceException {
		String nomeMetodo = "existsAllarmi";
		
		try {
			ServiceManagerProperties properties = new ServiceManagerProperties();
			properties.setDatabaseType(tipoDB);
			properties.setShowSql(true);
			JDBCServiceManager jdbcServiceManager = new JDBCServiceManager(con, properties, log);
			
			IAllarmeServiceSearch allarmiServiceSearch = jdbcServiceManager.getAllarmeServiceSearch();
			
			IExpression expr = allarmiServiceSearch.newExpression();
			
			if(tipoAllarme!=null) {
				expr.equals(Allarme.model().TIPO_ALLARME, tipoAllarme.getValue());
			}
			
			NonNegativeNumber count = allarmiServiceSearch.count(expr);
			
			return count.longValue() > 0;
		} catch (Exception qe) {
			throw new ServiceException("[DriverConfigurazioneDB::" + nomeMetodo + "] Errore : " + qe.getMessage(),qe);
		} 
	}
	
	public static long countAllarmi(TipoAllarme tipoAllarme, Connection con, Logger log, String tipoDB) throws ServiceException {
		String nomeMetodo = "countAllarmi";
		
		try {
			ServiceManagerProperties properties = new ServiceManagerProperties();
			properties.setDatabaseType(tipoDB);
			properties.setShowSql(true);
			JDBCServiceManager jdbcServiceManager = new JDBCServiceManager(con, properties, log);
			
			IAllarmeServiceSearch allarmiServiceSearch = jdbcServiceManager.getAllarmeServiceSearch();
			
			IExpression expr = allarmiServiceSearch.newExpression();
			
			if(tipoAllarme!=null) {
				expr.equals(Allarme.model().TIPO_ALLARME, tipoAllarme.getValue());
			}
			
			NonNegativeNumber count = allarmiServiceSearch.count(expr);
			
			return count.longValue();
		} catch (Exception qe) {
			throw new ServiceException("[DriverConfigurazioneDB::" + nomeMetodo + "] Errore : " + qe.getMessage(),qe);
		} 
	}
	
	public static void createHistoryAllarme(AllarmeHistory allarme, Connection con, Logger log, String tipoDB) throws ServiceException {
		String nomeMetodo = "createHistoryAllarme";

		try {
			ServiceManagerProperties properties = new ServiceManagerProperties();
			properties.setDatabaseType(tipoDB);
			properties.setShowSql(true);
			JDBCServiceManager jdbcServiceManager = new JDBCServiceManager(con, properties, log);
			
			IAllarmeHistoryService allarmiService = jdbcServiceManager.getAllarmeHistoryService();
			
			allarmiService.create(allarme);
			
		} catch (Exception qe) {
			throw new ServiceException("[DriverConfigurazioneDB::" + nomeMetodo + "] Errore : " + qe.getMessage(),qe);
		}
	}
	
	public static List<AllarmeHistory> allarmiHistoryList(ISearch ricerca, Long idAllarme, Connection con, Logger log, String tipoDB) throws ServiceException {
		String nomeMetodo = "allarmiHistoryList";
		int idLista = Liste.CONFIGURAZIONE_ALLARMI_HISTORY;
		int offset;
		int limit;
//		String search;

		limit = ricerca.getPageSize(idLista);
		offset = ricerca.getIndexIniziale(idLista);
//		search = (org.openspcoop2.core.constants.Costanti.SESSION_ATTRIBUTE_VALUE_RICERCA_UNDEFINED.equals(ricerca.getSearchString(idLista)) ? "" : ricerca.getSearchString(idLista));

//		String filterTipoPlugin = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_TIPO_PLUGIN_CLASSI);
		
//		this.log.debug("search : " + search);
		
		try {
			ServiceManagerProperties properties = new ServiceManagerProperties();
			properties.setDatabaseType(tipoDB);
			properties.setShowSql(true);
			JDBCServiceManager jdbcServiceManager = new JDBCServiceManager(con, properties, log);
			
			IAllarmeHistoryServiceSearch allarmiServiceSearch = jdbcServiceManager.getAllarmeHistoryServiceSearch();
			
			IExpression expr = allarmiServiceSearch.newExpression();
			
			AllarmeHistoryFieldConverter converter = new AllarmeHistoryFieldConverter(tipoDB);
			CustomField cf = new CustomField("id_allarme", Long.class, "id_allarme", converter.toTable(AllarmeHistory.model()));
			expr.equals(cf, idAllarme);
			
//			boolean addAnd = false;
			
//			if (!search.equals("")) {
//				expr.ilike(Allarme.model().NOME, search, LikeMode.ANYWHERE);
				
//				addAnd = true;
//			}
			
			NonNegativeNumber count = allarmiServiceSearch.count(expr);
			ricerca.setNumEntries(idLista,(int) count.longValue());
			
			// ricavo le entries
			if (limit == 0) // con limit
				limit = ISQLQueryObject.LIMIT_DEFAULT_VALUE;
			
			IPaginatedExpression pagExpr = allarmiServiceSearch.toPaginatedExpression(expr);
			
			pagExpr.limit(limit).offset(offset);
			pagExpr.addOrder(AllarmeHistory.model().TIMESTAMP_UPDATE, SortOrder.DESC);

			return allarmiServiceSearch.findAll(pagExpr);
			
		} catch (Exception qe) {
			throw new ServiceException("[DriverConfigurazioneDB::" + nomeMetodo + "] Errore : " + qe.getMessage(),qe);
		} 
	}
	
	private static String FREE_COUNTER_SEPARATOR_CHAR = "@"; 
	private static int FREE_COUNTER_SEPARATOR_CHAR_PAD = 19; // colonna che memorizza l'info ha dimensione 275
	public static String buildIdAlarm(String tipoPlugin, String serialId) {
		String idAlarm = tipoPlugin+AllarmiDriverUtils.FREE_COUNTER_SEPARATOR_CHAR+serialId;
		return idAlarm;
	}
	
	private static String normalizeAlarmInstanceSerialId(int value) {
		return StringUtils.leftPad(value+"", FREE_COUNTER_SEPARATOR_CHAR_PAD, "0");
	}
	public static String incrementAlarmInstanceSerialId(String value) {
		int valueInt = 0;
		if(value!=null && !"".equals(value)) {
			StringBuilder sb = new StringBuilder();
			for (int i = 0; i < value.length(); i++) {
				char c = value.charAt(i);
				if('0' == c && sb.length()<=0) {
					continue;
				}
				sb.append(c);
			}
			valueInt = Integer.valueOf(sb.toString());
		}
		valueInt++;
		return StringUtils.leftPad(valueInt+"", FREE_COUNTER_SEPARATOR_CHAR_PAD, "0");
	}
	
	//public static Integer getFreeCounterForAlarm(String tipoPlugin, Connection con, Logger log, String tipoDB) throws ServiceException{
	public static String getNextAlarmInstanceSerialId(String tipoPlugin, Connection con, Logger log, String tipoDB) throws ServiceException{
		String nomeMetodo = "getNextAlarmInstanceSerialId"; 
		
		
		try{
			ServiceManagerProperties properties = new ServiceManagerProperties();
			properties.setDatabaseType(tipoDB);
			properties.setShowSql(true);
			JDBCServiceManager jdbcServiceManager = new JDBCServiceManager(con, properties, log);
			
			IExpression pagExpr = jdbcServiceManager.getAllarmeServiceSearch().newExpression();
			pagExpr.and();
			pagExpr.equals(Allarme.model().TIPO, tipoPlugin);
			
			// non funziona perchè :10 viene ordinato prima di :9
			//pagExpr.addOrder(AttivazionePolicy.model().ID_ACTIVE_POLICY, SortOrder.DESC);
			//pagExpr.limit(1);
			// devo scorrerle tutte
			
			/*
			try{
				// inefficiente
				List<Object> list = jdbcServiceManager.getAllarmeServiceSearch().select(pagExpr, Allarme.model().NOME);
				if(list!=null && !list.isEmpty()){
					int found = -1;
					for (Object r : list) {
						if(r instanceof String){
							String s = (String)r;
							if(s.contains(FREE_COUNTER_SEPARATOR_CHAR)){
								int last = s.lastIndexOf(FREE_COUNTER_SEPARATOR_CHAR);
								if(last<(s.length()-1)){
									int value = Integer.parseInt(s.substring(s.lastIndexOf(FREE_COUNTER_SEPARATOR_CHAR)+1,s.length()));
									if(value > found) {
										found = value;
									}
								}
							}
						}	
					}
					if(found>0) {
						return found+1;
					}
				}
			}catch(NotFoundException notF){
				
			}
			return 1;*/
			
			FunctionField ff = new FunctionField(Allarme.model().NOME, Function.MAX, "maxAlarmId");
			Object maxValue = null;
			try {
				maxValue = jdbcServiceManager.getAllarmeServiceSearch().aggregate(pagExpr, ff);
			}catch(NotFoundException notFound) {
			}
			if(maxValue!=null){
				if(maxValue instanceof String){
					String s = (String)maxValue;
					if(s.contains(FREE_COUNTER_SEPARATOR_CHAR)){
						int last = s.lastIndexOf(FREE_COUNTER_SEPARATOR_CHAR);
						if(last<(s.length()-1)){
							String actualMaxValue = s.substring(s.lastIndexOf(FREE_COUNTER_SEPARATOR_CHAR)+1,s.length());
							return incrementAlarmInstanceSerialId(actualMaxValue);
						}
					}
				}	
			}
			return normalizeAlarmInstanceSerialId(1);
			
		} catch (Exception qe) {
			throw new ServiceException("[" + nomeMetodo +"] Errore : " + qe.getMessage(),qe);
		}
	}
	
	public static List<Allarme> configurazioneAllarmiList(ISearch ricerca, RuoloPorta ruoloPorta, String nomePorta, 
			Connection con, Logger log, String tipoDB,
			String nomeMetodo, 
			IDSoggetto filtroSoggettoFruitore, IDServizioApplicativo filtroApplicativoFruitore,String filtroRuoloFruitore,
			IDSoggetto filtroSoggettoErogatore, String filtroRuoloErogatore,
			IDServizio filtroServizioAzione, String filtroRuolo) throws ServiceException{
		// ritorna la configurazione allarmi
		int idLista = Liste.CONFIGURAZIONE_ALLARMI;
		String search = null;
		int offset = 0;
		int limit =0 ;

		if(ricerca != null) {
			search = (org.openspcoop2.core.constants.Costanti.SESSION_ATTRIBUTE_VALUE_RICERCA_UNDEFINED.equals(ricerca.getSearchString(idLista)) ? "" : ricerca.getSearchString(idLista));
			limit = ricerca.getPageSize(idLista);
			offset = ricerca.getIndexIniziale(idLista);
		}
		if (limit == 0) // con limit
			limit = ISQLQueryObject.LIMIT_DEFAULT_VALUE;
		
		log.debug("search : " + search);
		
		List<Allarme> listaAllarmi = new ArrayList<Allarme>();
		
		long count = 0;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			if(ricerca!=null) {

				ISQLQueryObject sqlQueryObject = _prepareSqlQueryObjectAllarmi(tipoDB,ruoloPorta, nomePorta, search, 
						filtroSoggettoFruitore, filtroApplicativoFruitore, filtroRuoloFruitore,
						filtroSoggettoErogatore, filtroRuoloErogatore,
						filtroServizioAzione, filtroRuolo);
				sqlQueryObject.addSelectCountField("nome", "allarmi");
				String query = sqlQueryObject.createSQLQuery();
				pstmt = con.prepareStatement(query);
				_prepareStatementAllarmi(tipoDB,pstmt, ruoloPorta, nomePorta, search, 
						filtroSoggettoFruitore, filtroApplicativoFruitore, filtroRuoloFruitore,
						filtroSoggettoErogatore, filtroRuoloErogatore,
						filtroServizioAzione, filtroRuolo);
				rs = pstmt.executeQuery();
				if(rs.next()) {
					count = rs.getLong("allarmi");
				}
				rs.close();
				pstmt.close();
				
			}
			
			ServiceManagerProperties properties = new ServiceManagerProperties();
			properties.setDatabaseType(tipoDB);
			properties.setShowSql(true);
			JDBCServiceManager serviceManager = new JDBCServiceManager(con, properties, log);
			
			
			ISQLQueryObject sqlQueryObject = _prepareSqlQueryObjectAllarmi(tipoDB,ruoloPorta, nomePorta, search, 
					filtroSoggettoFruitore, filtroApplicativoFruitore, filtroRuoloFruitore,
					filtroSoggettoErogatore, filtroRuoloErogatore,
					filtroServizioAzione, filtroRuolo);
			sqlQueryObject.addSelectField(CostantiDB.ALLARMI, "nome");
			sqlQueryObject.setOffset(offset);
			sqlQueryObject.setLimit(limit);
			//sqlQueryObject.addOrderBy("policy_alias", true);
			//sqlQueryObject.addOrderBy("policy_id", true);
			sqlQueryObject.addOrderBy(CostantiDB.ALLARMI+".nome", true);
			String query = sqlQueryObject.createSQLQuery();
			pstmt = con.prepareStatement(query);
			_prepareStatementAllarmi(tipoDB,pstmt, ruoloPorta, nomePorta, search, 
					filtroSoggettoFruitore, filtroApplicativoFruitore, filtroRuoloFruitore,
					filtroSoggettoErogatore, filtroRuoloErogatore,
					filtroServizioAzione, filtroRuolo);
			rs = pstmt.executeQuery();
			while(rs.next()) {
				
				String nomeAllarme = rs.getString("nome");
				
				IdAllarme idAllarmeAsObject = new IdAllarme();
				idAllarmeAsObject.setNome(nomeAllarme);
				Allarme allarme = serviceManager.getAllarmeServiceSearch().get(idAllarmeAsObject);
				listaAllarmi.add(allarme);
				
			}
			rs.close();
			pstmt.close();
						
		} catch (Exception qe) {
			throw new ServiceException("[" + nomeMetodo +"] Errore : " + qe.getMessage(),qe);
		} finally {
			try {
				if(rs!=null) {
					rs.close();
				}
			} catch (Exception e) {
				// ignore exception
			}
			try {
				if(pstmt!=null) {
					pstmt.close();
				}
			} catch (Exception e) {
				// ignore exception
			}
		}
		
		if(ricerca!=null) {
			ricerca.setNumEntries(idLista,(int) count);
		}
		
		return listaAllarmi;
		
	}
	private static ISQLQueryObject _prepareSqlQueryObjectAllarmi(
			String tipoDB,
			RuoloPorta ruoloPorta, String nomePorta,
			String search, 
			IDSoggetto filtroSoggettoFruitore, IDServizioApplicativo filtroApplicativoFruitore,String filtroRuoloFruitore,
			IDSoggetto filtroSoggettoErogatore, String filtroRuoloErogatore,
			IDServizio filtroServizioAzione, String filtroRuolo) throws Exception {
		ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(tipoDB);
		sqlQueryObject.setANDLogicOperator(true);
		sqlQueryObject.addFromTable(CostantiDB.ALLARMI);
		if(ruoloPorta!=null && nomePorta!=null) {
			sqlQueryObject.addWhereCondition("filtro_ruolo=?");
			sqlQueryObject.addWhereCondition("filtro_porta=?");
		}
		else if(ruoloPorta!=null) {
			sqlQueryObject.addWhereCondition("filtro_ruolo=?"); // se passo solo ruolo porta, voglio tutte le policy con quel ruolo. Altrimenti finisco nelle policy globali
		}
		else {
			sqlQueryObject.addWhereIsNullCondition("filtro_porta");
		}
		if(search != null  && !"".equals(search)){
			// fix: oramai l'alias e' obbligatorio
			sqlQueryObject.addWhereCondition(false, 
					//sqlQueryObject.getWhereLikeCondition("active_policy_id", search, false, true, true),
					sqlQueryObject.getWhereLikeCondition("alias", search, false, true, true));
		}
		if(filtroSoggettoFruitore!=null) {
			if(filtroSoggettoFruitore.getTipo()!=null) {
				sqlQueryObject.addWhereCondition("filtro_tipo_fruitore=?");
			}
			if(filtroSoggettoFruitore.getNome()!=null) {
				sqlQueryObject.addWhereCondition("filtro_nome_fruitore=?");
			}
		}
		if(filtroApplicativoFruitore!=null) {
			if(filtroApplicativoFruitore.getIdSoggettoProprietario()!=null) {
				if(filtroApplicativoFruitore.getIdSoggettoProprietario().getTipo()!=null) {
					sqlQueryObject.addWhereCondition("filtro_tipo_fruitore=?");
				}
				if(filtroApplicativoFruitore.getIdSoggettoProprietario().getNome()!=null) {
					sqlQueryObject.addWhereCondition("filtro_nome_fruitore=?");
				}
			}
			if(filtroApplicativoFruitore.getNome()!=null) {
				sqlQueryObject.addWhereCondition("filtro_sa_fruitore=?");
			}
		}
		if(filtroRuoloFruitore!=null) {
			sqlQueryObject.addWhereCondition("filtro_ruolo_fruitore=?");
		}
		if(filtroSoggettoErogatore!=null) {
			if(filtroSoggettoErogatore.getTipo()!=null) {
				sqlQueryObject.addWhereCondition("filtro_tipo_erogatore=?");
			}
			if(filtroSoggettoErogatore.getNome()!=null) {
				sqlQueryObject.addWhereCondition("filtro_nome_erogatore=?");
			}
		}
		if(filtroRuoloErogatore!=null) {
			sqlQueryObject.addWhereCondition("filtro_ruolo_erogatore=?");
		}
		if(filtroServizioAzione!=null) {
			if(filtroServizioAzione.getSoggettoErogatore()!=null) {
				if(filtroServizioAzione.getSoggettoErogatore().getTipo()!=null) {
					sqlQueryObject.addWhereCondition("filtro_tipo_erogatore=?");
				}
				if(filtroServizioAzione.getSoggettoErogatore().getNome()!=null) {
					sqlQueryObject.addWhereCondition("filtro_nome_erogatore=?");
				}
			}
			if(filtroServizioAzione.getTipo()!=null) {
				sqlQueryObject.addWhereCondition("filtro_tipo_servizio=?");
			}
			if(filtroServizioAzione.getNome()!=null) {
				sqlQueryObject.addWhereCondition("filtro_nome_servizio=?");
			}
			if(filtroServizioAzione.getVersione()!=null) {
				sqlQueryObject.addWhereCondition("filtro_versione_servizio=?");
			}
			if(filtroServizioAzione.getAzione()!=null) {
				// condizione di controllo
				ISQLQueryObject sqlQueryObjectOr = SQLObjectFactory.createSQLQueryObject(tipoDB);
				sqlQueryObjectOr.setANDLogicOperator(false);
				// (filtro_azione == 'NOME') OR (filtro_azione like 'NOME,%') OR (filtro_azione like '%,NOME') OR (filtro_azione like '%,applicabilita_azioni,%')
				// CLOB sqlQueryObjectOr.addWhereCondition(CostantiDB.CONTROLLO_TRAFFICO_ACTIVE_POLICY+".filtro_azione = ?");
				sqlQueryObjectOr.addWhereLikeCondition(CostantiDB.CONTROLLO_TRAFFICO_ACTIVE_POLICY+".filtro_azione", filtroServizioAzione.getAzione(), false , false);
				sqlQueryObjectOr.addWhereLikeCondition(CostantiDB.CONTROLLO_TRAFFICO_ACTIVE_POLICY+".filtro_azione", filtroServizioAzione.getAzione()+",", LikeConfig.startsWith(false));
				sqlQueryObjectOr.addWhereLikeCondition(CostantiDB.CONTROLLO_TRAFFICO_ACTIVE_POLICY+".filtro_azione", ","+filtroServizioAzione.getAzione(), LikeConfig.endsWith(false));
				sqlQueryObjectOr.addWhereLikeCondition(CostantiDB.CONTROLLO_TRAFFICO_ACTIVE_POLICY+".filtro_azione", ","+filtroServizioAzione.getAzione()+",", true , false);
				sqlQueryObject.addWhereCondition(sqlQueryObjectOr.createSQLConditions());
			}
		}
		if(filtroRuolo!=null) {
			sqlQueryObject.addWhereCondition(false, "filtro_ruolo_fruitore=?", "filtro_ruolo_erogatore=?");
		}
		return sqlQueryObject;
	}
	private static void _prepareStatementAllarmi(
			String tipoDB,
			PreparedStatement pstmt,
			RuoloPorta ruoloPorta, String nomePorta,
			String search, 
			IDSoggetto filtroSoggettoFruitore, IDServizioApplicativo filtroApplicativoFruitore,String filtroRuoloFruitore,
			IDSoggetto filtroSoggettoErogatore, String filtroRuoloErogatore,
			IDServizio filtroServizioAzione, String filtroRuolo) throws Exception {
		int index = 1;
		if(ruoloPorta!=null && nomePorta!=null) {
			pstmt.setString(index++, ruoloPorta.getValue());
			pstmt.setString(index++, nomePorta);
		}
		else if(ruoloPorta!=null) {
			pstmt.setString(index++, ruoloPorta.getValue());
		}
		if(filtroSoggettoFruitore!=null) {
			if(filtroSoggettoFruitore.getTipo()!=null) {
				pstmt.setString(index++, filtroSoggettoFruitore.getTipo());
			}
			if(filtroSoggettoFruitore.getNome()!=null) {
				pstmt.setString(index++, filtroSoggettoFruitore.getNome());
			}
		}
		if(filtroApplicativoFruitore!=null) {
			if(filtroApplicativoFruitore.getIdSoggettoProprietario()!=null) {
				if(filtroApplicativoFruitore.getIdSoggettoProprietario().getTipo()!=null) {
					pstmt.setString(index++, filtroApplicativoFruitore.getIdSoggettoProprietario().getTipo());
				}
				if(filtroApplicativoFruitore.getIdSoggettoProprietario().getNome()!=null) {
					pstmt.setString(index++, filtroApplicativoFruitore.getIdSoggettoProprietario().getNome());
				}
			}
			if(filtroApplicativoFruitore.getNome()!=null) {
				pstmt.setString(index++, filtroApplicativoFruitore.getNome());
			}
		}
		if(filtroRuoloFruitore!=null) {
			pstmt.setString(index++, filtroRuoloFruitore);
		}
		if(filtroSoggettoErogatore!=null) {
			if(filtroSoggettoErogatore.getTipo()!=null) {
				pstmt.setString(index++, filtroSoggettoErogatore.getTipo());
			}
			if(filtroSoggettoErogatore.getNome()!=null) {
				pstmt.setString(index++, filtroSoggettoErogatore.getNome());
			}
		}
		if(filtroRuoloErogatore!=null) {
			pstmt.setString(index++, filtroRuoloErogatore);
		}
		if(filtroServizioAzione!=null) {
			if(filtroServizioAzione.getSoggettoErogatore()!=null) {
				if(filtroServizioAzione.getSoggettoErogatore().getTipo()!=null) {
					pstmt.setString(index++, filtroServizioAzione.getSoggettoErogatore().getTipo());
				}
				if(filtroServizioAzione.getSoggettoErogatore().getNome()!=null) {
					pstmt.setString(index++, filtroServizioAzione.getSoggettoErogatore().getNome());
				}
			}
			if(filtroServizioAzione.getTipo()!=null) {
				pstmt.setString(index++, filtroServizioAzione.getTipo());
			}
			if(filtroServizioAzione.getNome()!=null) {
				pstmt.setString(index++, filtroServizioAzione.getNome());
			}
			if(filtroServizioAzione.getVersione()!=null) {
				pstmt.setInt(index++, filtroServizioAzione.getVersione());
			}
			if(filtroServizioAzione.getAzione()!=null) {
				// inserito direttamente nella preparazione
			}
		}
		if(filtroRuolo!=null) {
			pstmt.setString(index++, filtroRuolo);
			pstmt.setString(index++, filtroRuolo);
		}
	}
	
	
	public static List<Allarme> allarmiForPolicyRateLimiting(String activeIdPolicy, RuoloPorta ruoloPorta, String nomePorta, Connection con, Logger log, String tipoDB) throws ServiceException {
		String nomeMetodo = "allarmiForPolicyRateLimiting";
				
		try {
			ServiceManagerProperties properties = new ServiceManagerProperties();
			properties.setDatabaseType(tipoDB);
			properties.setShowSql(true);
			JDBCServiceManager jdbcServiceManager = new JDBCServiceManager(con, properties, log);
			
			IAllarmeServiceSearch allarmiServiceSearch = jdbcServiceManager.getAllarmeServiceSearch();
			
			IExpression expr = allarmiServiceSearch.newExpression();
			
			expr.and();
			
			if(ruoloPorta!=null && nomePorta!=null) {
				expr.equals(Allarme.model().FILTRO.RUOLO_PORTA, ruoloPorta.getValue()).and().equals(Allarme.model().FILTRO.NOME_PORTA, nomePorta);
			}
			else {
				expr.isNull(Allarme.model().FILTRO.NOME_PORTA);
			}
			
			expr.equals(Allarme.model().ALLARME_PARAMETRO.ID_PARAMETRO, CostantiConfigurazione.PARAM_POLICY_ID);
			if(activeIdPolicy!=null) {
				expr.like(Allarme.model().ALLARME_PARAMETRO.VALORE, activeIdPolicy,LikeMode.EXACT);
			}
			else {
				expr.isNull(Allarme.model().ALLARME_PARAMETRO.VALORE);
			}

			IPaginatedExpression pagExpr = allarmiServiceSearch.toPaginatedExpression(expr);
			
			pagExpr.addOrder(Allarme.model().ALIAS, SortOrder.ASC);

			return allarmiServiceSearch.findAll(pagExpr);
			
		} catch (Exception qe) {
			throw new ServiceException("[" + nomeMetodo + "] Errore : " + qe.getMessage(),qe);
		} 
	}
	
}