StatoViolazioniPolicy.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.controllo_traffico.beans;

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

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

	private List<String> violazioni = new ArrayList<>();
	private List<String> violazioniWarningOnly = new ArrayList<>();
	
	private static String RAGGRUPPAMENTO_DISABILITATO = "*";
	
	private static String SEPARATOR_VIOLAZIONE = "\n- ";
	private static String SEPARATOR_TRA_VIOLATE_E_WARNING = "\n\n";
	private static String WARN = "in modalità WarningOnly";
	
	public StatoViolazioniPolicy(String statoAttuale) {
		if(statoAttuale==null) {
			return;
		}
		String violate = null;
		String violateWarningOnly = null;
		if(statoAttuale.contains(SEPARATOR_TRA_VIOLATE_E_WARNING)) {
			String [] tmp = statoAttuale.split(SEPARATOR_TRA_VIOLATE_E_WARNING);
			for (int i = 0; i < tmp.length; i++) {
				String entry = tmp[i];
				if(entry.contains(WARN)) {
					violateWarningOnly = entry;
				}
				else {
					violate = entry;
				}
			}
		}
		else {
			if(statoAttuale.contains(WARN)) {
				violateWarningOnly = statoAttuale;
			}
			else {
				violate = statoAttuale;
			}
		}
		if(violate!=null) {
			if(violate.contains(SEPARATOR_VIOLAZIONE)) {
				String [] tmp = statoAttuale.split(SEPARATOR_VIOLAZIONE);
				if(tmp!=null && tmp.length>1) {
					// la prima riga e' l'intestazione
					for (int i = 1; i < tmp.length; i++) {
						String entry = tmp[i];
						this.violazioni.add(entry);
					}
				}
			}
			else {
				this.violazioni.add(violate);
			}
		}
		if(violateWarningOnly!=null) {
			if(violateWarningOnly.contains(SEPARATOR_VIOLAZIONE)) {
				String [] tmp = statoAttuale.split(SEPARATOR_VIOLAZIONE);
				if(tmp!=null && tmp.length>1) {
					// la prima riga e' l'intestazione
					for (int i = 1; i < tmp.length; i++) {
						String entry = tmp[i];
						this.violazioniWarningOnly.add(entry);
					}
				}
			}
			else {
				this.violazioniWarningOnly.add(violateWarningOnly);
			}
		}
	}
	
	@Override
	public String toString() {
		StringBuilder bf = new StringBuilder();
		if(this.violazioni.size()>0) {
			if(this.violazioni.size()==1) {
				bf.append("Rilevata violazione della policy: ");
			}
			else {
				bf.append("Rilevate ").append(this.violazioni.size()).append(" violazioni della policy: ");
			}
			for (String violazione : this.violazioni) {
				bf.append(SEPARATOR_VIOLAZIONE);
				bf.append(violazione);
			}
		}
		if(this.violazioniWarningOnly.size()>0) {
			if(this.violazioni.size()>0) {
				bf.append(SEPARATOR_TRA_VIOLATE_E_WARNING);
			}
			if(this.violazioniWarningOnly.size()==1) {
				bf.append("Rilevata violazione (in modalità WarningOnly) della policy: ");
			}
			else {
				bf.append("Rilevate ").append(this.violazioniWarningOnly.size()).append(" violazioni ("+WARN+") della policy: ");
			}
			for (String violazione : this.violazioniWarningOnly) {
				bf.append(SEPARATOR_VIOLAZIONE);
				bf.append(violazione);
			}
		}
		if(bf.length()>0)
			return bf.toString();
		else
			return "";
	}
	
	public void addViolazione(String gruppo,boolean warningOnly) {
		if(warningOnly) {
			this._addViolazione(gruppo, this.violazioniWarningOnly);
		}
		else {
			this._addViolazione(gruppo, this.violazioni);
		}
	}
	public boolean existsViolazione(String gruppo,boolean warningOnly) {
		if(warningOnly) {
			return this._existsViolazione(gruppo, this.violazioniWarningOnly);
		}
		else {
			return this._existsViolazione(gruppo, this.violazioni);
		}
	}
	public boolean removeViolazione(String gruppo,boolean warningOnly) {
		if(warningOnly) {
			return this._removeViolazione(gruppo, this.violazioniWarningOnly);
		}
		else {
			return this._removeViolazione(gruppo, this.violazioni);
		}
	}
	public int sizeViolazioni(boolean warningOnly) {
		if(warningOnly) {
			return this.violazioniWarningOnly.size();
		}
		else {
			return this.violazioni.size();
		}
	}

	
	private void _addViolazione(String gruppo, List<String> violazioni) {
		if(gruppo==null || gruppo.equals("") || gruppo.equalsIgnoreCase("Disabilitato")) {
			gruppo = RAGGRUPPAMENTO_DISABILITATO;
		}
		if(violazioni.contains(gruppo)==false) {
			violazioni.add(gruppo);
		}
	}
	
	private boolean _existsViolazione(String gruppo,  List<String> violazioni) {
		if(gruppo==null || gruppo.equals("") || gruppo.equalsIgnoreCase("Disabilitato")) {
			gruppo = RAGGRUPPAMENTO_DISABILITATO;
		}
		return violazioni.contains(gruppo);
	}
	
	private boolean _removeViolazione(String gruppo, List<String> violazioni) {
		if(gruppo==null || gruppo.equals("") || gruppo.equalsIgnoreCase("Disabilitato")) {
			gruppo = RAGGRUPPAMENTO_DISABILITATO;
		}
		int i = -1;
		boolean found = false;
		for (i = 0; i < violazioni.size(); i++) {
			if(violazioni.get(i).equals(gruppo)) {
				found = true;
				break;
			}
		}
		if(found) {
			violazioni.remove(i);
			return true;
		}
		return false;
	}
}