InformazioniRecordDiagnostici.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.logger.diagnostica;

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

import org.openspcoop2.core.commons.CoreException;
import org.openspcoop2.pdd.logger.record.AbstractDatoRicostruzione;
import org.openspcoop2.pdd.logger.record.CharDatoRicostruzione;
import org.openspcoop2.pdd.logger.record.StringDatoRicostruzione;
import org.openspcoop2.pdd.logger.record.TimestampDatoRicostruzione;

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

	protected boolean presenti = false;
	
	protected boolean ricostruibili = false;
	
	protected List<AbstractDatoRicostruzione<?>> dati = new ArrayList<>();

	protected List<InfoDiagnostico> diagnostici = new ArrayList<>();
		
	protected String motivoRicostruzioneNonFattibile = null;
	
	
	// Gli Ext servono per generare diagnostici dinamici che magari presentano template uguali ma che devono essere risolti con valori diversi
	
	protected List<InfoDiagnostico> diagnosticiExt = new ArrayList<>();
	
	protected List<DynamicExtendedInfoDiagnostico> datiExt = new ArrayList<>();
	
	protected String rawDBValue = null;
	
	public String getRawDBValue() {
		return this.rawDBValue;
	}

	public void setRawDBValue(String rawDBValue) {
		this.rawDBValue = rawDBValue;
	}
	

	public String getMotivoRicostruzioneNonFattibile() {
		return this.motivoRicostruzioneNonFattibile;
	}
	
	public boolean isRicostruibili() {
		return this.ricostruibili;
	}
	
	public boolean isPresenti() {
		return this.presenti;
	}

	public int sizeMetaDati(){
		return this.dati.size();
	}
	
	public AbstractDatoRicostruzione<?> getDato(MappingRicostruzioneDiagnostici mapping){
		if(mapping.getValue()==null) {
			return null;
		}
		int index = mapping.getValue();
		if(index < this.dati.size()) {
			return this.dati.get(index);
		}
		return null;
	}
	
	public List<InfoDiagnostico> getDiagnostici() {
		return this.diagnostici;
	}
	
	public void setPresenti(boolean presenti) {
		this.presenti = presenti;
	}
	
	public void setRicostruibili(boolean ricostruibili) {
		this.ricostruibili = ricostruibili;
	}

	public void setMotivoRicostruzioneNonFattibile(
			String motivoRicostruzioneNonFattibile) {
		this.motivoRicostruzioneNonFattibile = motivoRicostruzioneNonFattibile;
	}

	public void setDati(List<AbstractDatoRicostruzione<?>> dati) {
		this.dati = dati;
	}
	
	public void setDiagnostici(List<InfoDiagnostico> diagnostici) {
		this.diagnostici = diagnostici;
	}
	
	public List<InfoDiagnostico> getDiagnosticiExt() {
		return this.diagnosticiExt;
	}

	public void setDiagnosticiExt(List<InfoDiagnostico> diagnosticiExt) {
		this.diagnosticiExt = diagnosticiExt;
	}

	public void setDatiExt(List<DynamicExtendedInfoDiagnostico> datiExt) {
		this.datiExt = datiExt;
	}
	
	public List<DynamicExtendedInfoDiagnostico> getDatiExt() {
		return this.datiExt;
	}
	
	
	
	@Override
	public String toString(){
		StringBuilder bf = new StringBuilder();
		bf.append("---- Diagnostici -----\n");
		bf.append("\tpresenti("+this.presenti+")\n");
		bf.append("\tricostruibili("+this.ricostruibili+")\n");
		bf.append("\tdati size:"+this.dati.size()).append("\n");
		for (int i = 0; i < this.dati.size(); i++) {
			bf.append("\t\tdato["+MappingRicostruzioneDiagnostici.toEnumConstant(i).name()+"("+i+")]").append("\n");
			bf.append("\t\t\tdescrizione:"+this.dati.get(i).getInfo().getDescription()).append("\n");
			try{
				bf.append("\t\t\tvalore:"+this.dati.get(i).convertToString()).append("\n");
			}catch(Exception e){
				bf.append("\t\t\tvalore: ERRORE NEL CALCOLO: "+e.getMessage()).append("\n");
			}
		}
		if(!this.ricostruibili){
			bf.append(" motivoRicostruzioneNonFattibile("+this.motivoRicostruzioneNonFattibile+")\n");	
		}
		return bf.toString();
	}
		
	public static InformazioniRecordDiagnostici convertoFromDBColumnValue(String columnMetaInf, String columnList1, String columnList2,
			String columnListExt, String datiExt) throws CoreException{
		
		InformazioniRecordDiagnostici info = new InformazioniRecordDiagnostici();
		
		if(columnMetaInf == null || "".equals(columnMetaInf.trim())){
			throw new CoreException("Valore non fornito");
		}
		info.setRawDBValue(columnMetaInf);
		
		if(columnMetaInf.length()==1 && (CostantiMappingDiagnostici.NON_PRESENTE == columnMetaInf.charAt(0)) ){
			info.setPresenti(false);
			return info;
		}
		
		info.setPresenti(true);
		
		
		// meta-inf
		
		String dbValue = columnMetaInf.trim();
		
		if(!dbValue.contains(CostantiMappingDiagnostici.SEPARATOR)){
			info.setRicostruibili(false);
			info.setMotivoRicostruzioneNonFattibile("Non sono presenti caratteri separatori ["+CostantiMappingDiagnostici.SEPARATOR+"] nel valore");
			return info;
		}
		
		String [] split = dbValue.split(CostantiMappingDiagnostici.SEPARATOR);
		Date gdoFirstDiagnostic = null;
		if( CostantiMappingDiagnostici.DIAGNOSTICI_EMESSI_RICOSTRUIBILI != split[0].charAt(0) ){
			info.setRicostruibili(false);
			info.setMotivoRicostruzioneNonFattibile(dbValue);
		}
		else{
			info.setRicostruibili(true);
			List<AbstractDatoRicostruzione<?>> listaDati = new ArrayList<>();
			info.setDati(listaDati);
			
			listaDati.add(new CharDatoRicostruzione(split[MappingRicostruzioneDiagnostici.DIAGNOSTICI_EMESSI.getPosition()],
					CostantiMappingDiagnostici.DIAGNOSTICI_EMESSI));
			
			listaDati.add(new TimestampDatoRicostruzione(split[MappingRicostruzioneDiagnostici.DIAGNOSTICI_EMISSIONE_FIRST_DATE.getPosition()],
					CostantiMappingDiagnostici.DIAGNOSTICI_EMISSIONE_FIRST_DATE));
			Object oGdoFist = listaDati.get(MappingRicostruzioneDiagnostici.DIAGNOSTICI_EMISSIONE_FIRST_DATE.getPosition()).getDato();
			gdoFirstDiagnostic = (oGdoFist!=null ? (Date)oGdoFist : null);
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.TIPO_AUTORIZZAZIONE.getPosition()],
					CostantiMappingDiagnostici.TIPO_AUTORIZZAZIONE));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.CODICE_TRASPORTO_RICHIESTA.getPosition()],
					CostantiMappingDiagnostici.CODICE_TRASPORTO_RICHIESTA));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.CODICE_TRASPORTO_RISPOSTA.getPosition()],
					CostantiMappingDiagnostici.CODICE_TRASPORTO_RISPOSTA));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.TIPO_CONNETTORE.getPosition()],
					CostantiMappingDiagnostici.TIPO_CONNETTORE));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.MAX_THREADS_THRESHOLD.getPosition()],
					CostantiMappingDiagnostici.MAX_THREADS_THRESHOLD));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.CONTROLLO_TRAFFICO_THRESHOLD.getPosition()],
					CostantiMappingDiagnostici.CONTROLLO_TRAFFICO_THRESHOLD));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.ACTIVE_THREADS.getPosition()],
					CostantiMappingDiagnostici.ACTIVE_THREADS));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.NUMERO_POLICY_CONFIGURATE.getPosition()],
					CostantiMappingDiagnostici.NUMERO_POLICY_CONFIGURATE));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.NUMERO_POLICY_DISABILITATE.getPosition()],
					CostantiMappingDiagnostici.NUMERO_POLICY_DISABILITATE));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.NUMERO_POLICY_FILTRATE.getPosition()],
					CostantiMappingDiagnostici.NUMERO_POLICY_FILTRATE));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.NUMERO_POLICY_NON_APPLICATE.getPosition()],
					CostantiMappingDiagnostici.NUMERO_POLICY_NON_APPLICATE));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.NUMERO_POLICY_RISPETTATE.getPosition()],
					CostantiMappingDiagnostici.NUMERO_POLICY_RISPETTATE));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.NUMERO_POLICY_VIOLATE.getPosition()],
					CostantiMappingDiagnostici.NUMERO_POLICY_VIOLATE));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.NUMERO_POLICY_VIOLATE_WARNING_ONLY.getPosition()],
					CostantiMappingDiagnostici.NUMERO_POLICY_VIOLATE_WARNING_ONLY));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.NUMERO_POLICY_IN_ERRORE.getPosition()],
					CostantiMappingDiagnostici.NUMERO_POLICY_IN_ERRORE));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.TIPO_AUTENTICAZIONE.getPosition()],
					CostantiMappingDiagnostici.TIPO_AUTENTICAZIONE));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.TIPO_AUTORIZZAZIONE_CONTENUTI.getPosition()],
					CostantiMappingDiagnostici.TIPO_AUTORIZZAZIONE_CONTENUTI));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.TIPO_VALIDAZIONE_CONTENUTI.getPosition()],
					CostantiMappingDiagnostici.TIPO_VALIDAZIONE_CONTENUTI));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.TIPO_PROCESSAMENTO_MTOM_RICHIESTA.getPosition()],
					CostantiMappingDiagnostici.TIPO_PROCESSAMENTO_MTOM_RICHIESTA));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.TIPO_PROCESSAMENTO_MTOM_RISPOSTA.getPosition()],
					CostantiMappingDiagnostici.TIPO_PROCESSAMENTO_MTOM_RISPOSTA));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.TIPO_PROCESSAMENTO_MESSAGE_SECURITY_RICHIESTA.getPosition()],
					CostantiMappingDiagnostici.TIPO_PROCESSAMENTO_MESSAGE_SECURITY_RICHIESTA));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.TIPO_PROCESSAMENTO_MESSAGE_SECURITY_RISPOSTA.getPosition()],
					CostantiMappingDiagnostici.TIPO_PROCESSAMENTO_MESSAGE_SECURITY_RISPOSTA));
				
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.AUTENTICAZIONE_IN_CACHE.getPosition()],
					CostantiMappingDiagnostici.AUTENTICAZIONE_IN_CACHE));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.AUTORIZZAZIONE_IN_CACHE.getPosition()],
					CostantiMappingDiagnostici.AUTORIZZAZIONE_IN_CACHE));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.AUTORIZZAZIONE_CONTENUTI_IN_CACHE.getPosition()],
					CostantiMappingDiagnostici.AUTORIZZAZIONE_CONTENUTI_IN_CACHE));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.TOKEN_POLICY.getPosition()],
					CostantiMappingDiagnostici.TOKEN_POLICY));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.TOKEN_POLICY_ACTIONS.getPosition()],
					CostantiMappingDiagnostici.TOKEN_POLICY_ACTIONS));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.TOKEN_POLICY_AUTENTCAZIONE.getPosition()],
					CostantiMappingDiagnostici.TOKEN_POLICY_AUTENTCAZIONE));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.RESPONSE_FROM_CACHE.getPosition()],
					CostantiMappingDiagnostici.RESPONSE_FROM_CACHE));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.TIPO_TRASFORMAZIONE_RICHIESTA.getPosition()],
					CostantiMappingDiagnostici.TIPO_TRASFORMAZIONE_RICHIESTA));
			
			listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.TIPO_TRASFORMAZIONE_RISPOSTA.getPosition()],
					CostantiMappingDiagnostici.TIPO_TRASFORMAZIONE_RISPOSTA));
			
			if(split.length>(CostantiMappingDiagnostici.LENGHT_DATI_SIMULATI_VERSIONE_ATTUALE_PRECEDENTE_INTRODOTTO_33_34)){
			
				listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.AUTENTICAZIONE_TOKEN_IN_CACHE.getPosition()],
						CostantiMappingDiagnostici.AUTENTICAZIONE_TOKEN_IN_CACHE));
				
				listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.AUTENTICAZIONE_FALLITA_MOTIVAZIONE.getPosition()],
						CostantiMappingDiagnostici.AUTENTICAZIONE_FALLITA_MOTIVAZIONE));
				
			}
			
			if(split.length>(CostantiMappingDiagnostici.LENGHT_DATI_SIMULATI_VERSIONE_ATTUALE_PRECEDENTE_INTRODOTTO_35_36_37)){
				
				listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.MODI_TOKEN_AUTHORIZATION_IN_CACHE.getPosition()],
						CostantiMappingDiagnostici.MODI_TOKEN_AUTHORIZATION_IN_CACHE));
				
				listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.MODI_TOKEN_INTEGRITY_IN_CACHE.getPosition()],
						CostantiMappingDiagnostici.MODI_TOKEN_INTEGRITY_IN_CACHE));
				
				listaDati.add(new StringDatoRicostruzione(split[MappingRicostruzioneDiagnostici.MODI_TOKEN_AUDIT_IN_CACHE.getPosition()],
						CostantiMappingDiagnostici.MODI_TOKEN_AUDIT_IN_CACHE));
				
			}
			
			if(split.length>CostantiMappingDiagnostici.LENGHT_DATI_SIMULATI_VERSIONE_ATTUALE){
				
				// NOTA: successivi dati aggiunti
				// GESTIRE QUANDO SI INTRODUCONO NUOVE INFO
				
			}
		}
		
		
		// diagnostic
		
		List<InfoDiagnostico> listaDiagnostici = new ArrayList<>();
		info.setDiagnostici(listaDiagnostici);
		
		if( (columnList1==null || "".equals(columnList1)) 
				&&
			(info.isPresenti() && info.isRicostruibili())
			&&
				
			// Prima di sollevare l'eccezione controllo se i diagnostici simulati sono presenti solamente nella colonna column ext
			(columnListExt==null || "".equals(columnListExt) ||
					datiExt==null || "".equals(datiExt))
			){
			throw new CoreException("Valore ColumnList1 non fornito, nonostante dovrebbero essere presenti dei diagnostici (informazione meta-inf indica la presenza e indica che sono ricostruibili)");
		}
		if(columnList1!=null && !"".equals(columnList1)){
			String [] splitDiagnosticList1 = columnList1.split(CostantiMappingDiagnostici.SEPARATOR);
			if(splitDiagnosticList1.length>CostantiMappingDiagnostici.MAX_DIAGNOSTIC_LIST_ROW_1){
				throw new CoreException("Valore ColumnList1 fornito non corretto. Non possono essere definiti piu' di "+CostantiMappingDiagnostici.MAX_DIAGNOSTIC_LIST_ROW_1+" diagnostici (separati dal carattere separatore ["+CostantiMappingDiagnostici.SEPARATOR+"])");
			}
			for (int i = 0; i < splitDiagnosticList1.length; i++) {
				String diagnostic = splitDiagnosticList1[i].trim();
				listaDiagnostici.add(InfoDiagnostico.convertoFromDBColumnValue(gdoFirstDiagnostic, diagnostic));
			}
		}
		
		if(columnList2!=null && !"".equals(columnList2)){
			String [] splitDiagnosticList2 = columnList2.split(CostantiMappingDiagnostici.SEPARATOR);
			if(splitDiagnosticList2.length>CostantiMappingDiagnostici.MAX_DIAGNOSTIC_LIST_ROW_2){
				throw new CoreException("Valore ColumnList2 fornito non corretto. Non possono essere definiti piu' di "+CostantiMappingDiagnostici.MAX_DIAGNOSTIC_LIST_ROW_2+" diagnostici (separati dal carattere separatore ["+CostantiMappingDiagnostici.SEPARATOR+"])");
			}
			for (int i = 0; i < splitDiagnosticList2.length; i++) {
				String diagnostic = splitDiagnosticList2[i].trim();
				listaDiagnostici.add(InfoDiagnostico.convertoFromDBColumnValue(gdoFirstDiagnostic, diagnostic));
			}
		}
		
		if(columnListExt!=null && !"".equals(columnListExt)){
			
			if(datiExt==null || "".equals(datiExt)){
				throw new CoreException("Trovato valore ColumnListExt ma non esiste un analogo valore per i DatiExt");
			}
						
			String [] splitDiagnosticListExt = columnListExt.split(CostantiMappingDiagnostici.SEPARATOR);
			String [] splitDatiExt = datiExt.split(CostantiMappingDiagnostici.DIAGNOSTIC_WITH_DYNAMIC_INFO_DIAG_SEPARATOR);
			
			if(splitDiagnosticListExt==null || splitDiagnosticListExt.length<=0){
				throw new CoreException("Trovato valore ColumnListExt corrotto");
			}
			if(splitDatiExt==null || splitDatiExt.length<=0){
				throw new CoreException("Trovato valore DatiExt corrotto");
			}
			if(splitDiagnosticListExt.length!=splitDatiExt.length){
				throw new CoreException("Assocazione tra ColumnListExt("+splitDiagnosticListExt.length+") e DatiExt("+splitDatiExt.length+") non corretta");
			}
			
			List<InfoDiagnostico> listaDiagnosticiExt = new ArrayList<>();
			info.setDiagnosticiExt(listaDiagnosticiExt);
			
			List<DynamicExtendedInfoDiagnostico> listaDatiExt = new ArrayList<>();
			info.setDatiExt(listaDatiExt);
			
			for (int i = 0; i < splitDiagnosticListExt.length; i++) {
				
				String diagnostic = splitDiagnosticListExt[i].trim();
				listaDiagnosticiExt.add(InfoDiagnostico.convertoFromDBColumnValue(gdoFirstDiagnostic, diagnostic));
				
				String valueExt = splitDatiExt[i].trim();
				listaDatiExt.add(DynamicExtendedInfoDiagnostico.convertoFromDBColumnValue(valueExt));
				
			}
			
		}
		
		return info;
	}
}