StatisticsForceIndexConfig.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.monitor.engine.statistic;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import org.openspcoop2.core.transazioni.Transazione;
import org.openspcoop2.generic_project.expression.Index;
import org.openspcoop2.utils.UtilsException;
import org.openspcoop2.utils.properties.InstanceProperties;

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

	/** Lista di indici forzati */
	private List<Index> transazioniForceIndexGroupByNumeroDimensione = null;
	private List<Index> transazioniForceIndexGroupByLatenze = null;
	private List<Index> transazioniForceIndexGroupByCustomNumeroDimensione = null;
	private List<Index> transazioniForceIndexGroupByCustomLatenze = null;
	
	public StatisticsForceIndexConfig(){}
	
	private static final String P_REPO = "statistiche.generazione.forceIndex.repository";
	private static final String P_GROUPBY_NUMERO_DIMENSIONE = "statistiche.generazione.forceIndex.groupBy.numero_dimensione";
	private static final String P_GROUPBY_LATENZA = "statistiche.generazione.forceIndex.groupBy.latenza";
	private static final String P_GROUPBY_CUSTOM_NUMERO_DIMENSIONE = "statistiche.generazione.forceIndex.groupBy.custom.numero_dimensione";
	private static final String P_GROUPBY_CUSTOM_LATENZA = "statistiche.generazione.forceIndex.groupBy.custom.latenza";
	
	public StatisticsForceIndexConfig(Properties p) throws IOException {
		
		String tmpRepo = p.getProperty(StatisticsForceIndexConfig.P_REPO);
		Properties pRepoExternal = this.getExternalRepository(tmpRepo);

		String groupByNumeroDimensione = p.getProperty(StatisticsForceIndexConfig.P_GROUPBY_NUMERO_DIMENSIONE);
		if(groupByNumeroDimensione!=null){
			groupByNumeroDimensione = groupByNumeroDimensione.trim();
		}
		this.transazioniForceIndexGroupByNumeroDimensione = this.getIndexList(StatisticsForceIndexConfig.P_GROUPBY_NUMERO_DIMENSIONE, groupByNumeroDimensione, pRepoExternal);
		
		String groupByLatenza = p.getProperty(StatisticsForceIndexConfig.P_GROUPBY_LATENZA);
		if(groupByLatenza!=null){
			groupByLatenza = groupByLatenza.trim();
		}
		this.transazioniForceIndexGroupByLatenze = this.getIndexList(StatisticsForceIndexConfig.P_GROUPBY_LATENZA, groupByLatenza, pRepoExternal);
		
		String groupCustomByNumeroDimensione = p.getProperty(StatisticsForceIndexConfig.P_GROUPBY_CUSTOM_NUMERO_DIMENSIONE);
		if(groupCustomByNumeroDimensione!=null){
			groupCustomByNumeroDimensione = groupCustomByNumeroDimensione.trim();
		}
		this.transazioniForceIndexGroupByCustomNumeroDimensione = this.getIndexList(StatisticsForceIndexConfig.P_GROUPBY_CUSTOM_NUMERO_DIMENSIONE, groupCustomByNumeroDimensione, pRepoExternal);
		
		String groupCustomByLatenza = p.getProperty(StatisticsForceIndexConfig.P_GROUPBY_CUSTOM_LATENZA);
		if(groupCustomByLatenza!=null){
			groupCustomByLatenza = groupCustomByLatenza.trim();
		}
		this.transazioniForceIndexGroupByCustomLatenze = this.getIndexList(StatisticsForceIndexConfig.P_GROUPBY_CUSTOM_LATENZA, groupCustomByLatenza, pRepoExternal);
		
	}
	
	public StatisticsForceIndexConfig(InstanceProperties p) throws IOException, UtilsException {
		
		String tmpRepo = p.getValueConvertEnvProperties(StatisticsForceIndexConfig.P_REPO);
		Properties pRepoExternal = this.getExternalRepository(tmpRepo);
		
		String groupByNumeroDimensione = p.getValueConvertEnvProperties(StatisticsForceIndexConfig.P_GROUPBY_NUMERO_DIMENSIONE);
		if(groupByNumeroDimensione!=null){
			groupByNumeroDimensione = groupByNumeroDimensione.trim();
		}
		this.transazioniForceIndexGroupByNumeroDimensione = this.getIndexList(StatisticsForceIndexConfig.P_GROUPBY_NUMERO_DIMENSIONE, groupByNumeroDimensione, pRepoExternal);
		
		String groupByLatenza = p.getValueConvertEnvProperties(StatisticsForceIndexConfig.P_GROUPBY_LATENZA);
		if(groupByLatenza!=null){
			groupByLatenza = groupByLatenza.trim();
		}
		this.transazioniForceIndexGroupByLatenze = this.getIndexList(StatisticsForceIndexConfig.P_GROUPBY_LATENZA, groupByLatenza, pRepoExternal);
		
		String groupCustomByNumeroDimensione = p.getValueConvertEnvProperties(StatisticsForceIndexConfig.P_GROUPBY_CUSTOM_NUMERO_DIMENSIONE);
		if(groupCustomByNumeroDimensione!=null){
			groupCustomByNumeroDimensione = groupCustomByNumeroDimensione.trim();
		}
		this.transazioniForceIndexGroupByCustomNumeroDimensione = this.getIndexList(StatisticsForceIndexConfig.P_GROUPBY_CUSTOM_NUMERO_DIMENSIONE, groupCustomByNumeroDimensione, pRepoExternal);
		
		String groupCustomByLatenza = p.getValueConvertEnvProperties(StatisticsForceIndexConfig.P_GROUPBY_CUSTOM_LATENZA);
		if(groupCustomByLatenza!=null){
			groupCustomByLatenza = groupCustomByLatenza.trim();
		}
		this.transazioniForceIndexGroupByCustomLatenze = this.getIndexList(StatisticsForceIndexConfig.P_GROUPBY_CUSTOM_LATENZA, groupCustomByLatenza, pRepoExternal);
		
	}
	
	private Properties getExternalRepository(String tmpRepo) throws IOException{
		Properties pRepoExternal = null;
		if(tmpRepo!=null){
			File f = new File(tmpRepo);
			try (InputStream is = f.exists() ? new FileInputStream(f) : StatisticsForceIndexConfig.class.getResourceAsStream(tmpRepo)){ // provo a cercarlo nel classpath se non e' un file esistente
				if(is!=null){
					pRepoExternal = new Properties();
					pRepoExternal.load(is);
				}
			}
		}
		return  pRepoExternal;
	}
	
	private List<Index> getIndexList(String propertyName,String propertyValue, Properties externalRepository) {
		
		String s = null;
		if(externalRepository!=null){
			String tmp = externalRepository.getProperty(propertyName);
			if(tmp!=null){
				s = tmp.trim();
			}
		}
		if(s==null){
			// provo a cercarlo nel file monitor
			s = propertyValue;
		}
		
		List<Index> l = null;
		if(s!=null){
			l = new ArrayList<>();
			if(s.contains(",")){
				String [] split = s.split(",");
				for (int i = 0; i < split.length; i++) {
					l.add(new Index(Transazione.model(),split[i]));
				}
			}
			else{
				l.add(new Index(Transazione.model(),s));
			}
			return l;
		}
		return l;
	}
	

	public List<Index> getTransazioniForceIndexGroupByNumeroDimensione() {
		return this.transazioniForceIndexGroupByNumeroDimensione;
	}

	public void setTransazioniForceIndexGroupByNumeroDimensione(
			List<Index> transazioniForceIndexGroupByNumeroDimensione) {
		this.transazioniForceIndexGroupByNumeroDimensione = transazioniForceIndexGroupByNumeroDimensione;
	}

	public List<Index> getTransazioniForceIndexGroupByLatenze() {
		return this.transazioniForceIndexGroupByLatenze;
	}

	public void setTransazioniForceIndexGroupByLatenze(List<Index> transazioniForceIndexGroupByLatenze) {
		this.transazioniForceIndexGroupByLatenze = transazioniForceIndexGroupByLatenze;
	}
	
	public List<Index> getTransazioniForceIndexGroupByCustomNumeroDimensione() {
		return this.transazioniForceIndexGroupByCustomNumeroDimensione;
	}

	public void setTransazioniForceIndexGroupByCustomNumeroDimensione(
			List<Index> transazioniForceIndexGroupByCustomNumeroDimensione) {
		this.transazioniForceIndexGroupByCustomNumeroDimensione = transazioniForceIndexGroupByCustomNumeroDimensione;
	}

	public List<Index> getTransazioniForceIndexGroupByCustomLatenze() {
		return this.transazioniForceIndexGroupByCustomLatenze;
	}

	public void setTransazioniForceIndexGroupByCustomLatenze(List<Index> transazioniForceIndexGroupByCustomLatenze) {
		this.transazioniForceIndexGroupByCustomLatenze = transazioniForceIndexGroupByCustomLatenze;
	}


}