EsitiConfigUtils.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.protocol.utils;

import java.util.ArrayList;
import java.util.List;

import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.sdk.constants.EsitoTransazioneName;
import org.slf4j.Logger;

/**     
 * EsitiConfigUtils
 *
 * @author Poli Andrea (poli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class EsitiConfigUtils {
	
	private EsitiConfigUtils() {}

	public static int TUTTI_ESITI_DISABILITATI = -2;
	
	public static EsitiProperties getEsitiPropertiesForConfiguration(Logger log) throws ProtocolException {
		return EsitiProperties.getInstance(log, EsitiProperties.NO_PROTOCOL_CONFIG);
	}
	public static EsitiProperties getEsitiPropertiesForContext(Logger log) throws ProtocolException {
		return EsitiProperties.getInstance(log, EsitiProperties.NO_PROTOCOL_CONFIG);
	}
	
	// esiti indipendenti dal protocollo. Li inizializzo una volta sola per questione di performance.
	
	private static int esitoMaxThreads = -1;
	private static int esitoViolazionePolicyRateLimiting = -1;
	private static int esitoCorsGateway = -1;
	private static int esitoCorsTrasparente = -1;
	private static void checkInitEsiti(EsitiProperties esiti) throws ProtocolException {
		if(esitoMaxThreads<0) {
			initEsiti(esiti);
		}
	}
	private static synchronized void initEsiti(EsitiProperties esiti) throws ProtocolException {
		if(esitoMaxThreads<0) {
			esitoMaxThreads = esiti.convertNameToCode(EsitoTransazioneName.CONTROLLO_TRAFFICO_MAX_THREADS.name());
			esitoViolazionePolicyRateLimiting = esiti.convertNameToCode(EsitoTransazioneName.CONTROLLO_TRAFFICO_POLICY_VIOLATA.name());
			esitoCorsGateway = esiti.convertNameToCode(EsitoTransazioneName.CORS_PREFLIGHT_REQUEST_VIA_GATEWAY.name());
			esitoCorsTrasparente = esiti.convertNameToCode(EsitoTransazioneName.CORS_PREFLIGHT_REQUEST_TRASPARENTE.name());
		}
	}
	
	public static List<String> getRegistrazioneEsiti(String esitiConfig, Logger log, StringBuilder bf) throws ProtocolException{
		return getRegistrazioneEsiti(esitiConfig, log, bf, getEsitiPropertiesForConfiguration(log));
	}
	public static List<String> getRegistrazioneEsiti(String esitiConfig, Logger log, StringBuilder bf, EsitiProperties esiti) throws ProtocolException {
		
		if(log!=null) {
			// nop
		}
		List<String> listNull = null;
		
		if(esitiConfig==null || "".equals(esitiConfig.trim())){
			
			// creo un default composto da tutti ad eccezione dell'esito (CONTROLLO_TRAFFICO_MAX_THREADS), delle violazioni policy di rate limiting (CONTROLLO_TRAFFICO_POLICY_VIOLATA) e delle richieste CORS OPTIONS 
			List<Integer> esitiCodes = esiti.getEsitiCode();
			
			if(esitiCodes!=null && !esitiCodes.isEmpty()){
				List<String> esitiDaRegistrare = new ArrayList<>();
				for (Integer esito : esitiCodes) {
					checkInitEsiti(esiti);
					if(esito.intValue()!=esitoMaxThreads &&
							esito.intValue()!=esitoViolazionePolicyRateLimiting && 
							esito.intValue()!=esitoCorsGateway && 
							esito.intValue()!=esitoCorsTrasparente){
						if(bf.length()>0){
							bf.append(",");
						}
						bf.append(esito);
						esitiDaRegistrare.add(esito+"");
					}
				}
				if(!esitiDaRegistrare.isEmpty()){
					return esitiDaRegistrare;
				}
			}
			
			return listNull; // non dovrebbe succedere, degli esiti nell'EsitiProperties dovrebbero esistere
		}
		else{
			
			String [] tmp = esitiConfig.split(",");
			if(tmp!=null && tmp.length>0){
				List<String> esitiDaRegistrare = new ArrayList<>();
				for (int i = 0; i < tmp.length; i++) {
					String t = tmp[i];
					if(t!=null){
						t = t.trim();
						if(!"".equals(t)){
							if(bf.length()>0){
								bf.append(",");
							}
							bf.append(t);
							esitiDaRegistrare.add(t);
						}
					}
				}
				if(!esitiDaRegistrare.isEmpty()){
					return esitiDaRegistrare;
				}
			}
			
			return listNull; // non dovrebbe succedere, si rientra nel ramo then dell'if principale
		}
	}
	
}