SondaBatch.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.utils.sonde.impl;

import java.sql.Connection;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;

import org.openspcoop2.utils.TipiDatabase;
import org.openspcoop2.utils.io.Base64Utilities;
import org.openspcoop2.utils.sonde.ParametriSonda;
import org.openspcoop2.utils.sonde.Sonda;
import org.openspcoop2.utils.sonde.SondaException;

/**
 * Classe di implementazione della Sonda per i batch
 * 
 *
 * @author Bussu Giovanni (bussu@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class SondaBatch extends Sonda {

	/**
	 * Costruttore per la classe SondaBatch
	 * @param param parametri costruttivi della sonda
	 * @throws Exception
	 */
	public SondaBatch(ParametriSonda param) {
		super(param);
		Set<String> reserved = new HashSet<String>();
		reserved.add("data_ultimo_batch");
		reserved.add("esito_batch");
		reserved.add("interazioni_fallite");
		reserved.add("descrizione_errore");
		this.getParam().setReserved(reserved);

	}

	@Override
	public StatoSonda getStatoSonda(){


		Date now = new Date();
		Date data_warn = new Date(now.getTime() - super.getParam().getSogliaWarn());
		Date data_err = new Date(now.getTime() - super.getParam().getSogliaError());

		StatoSonda statoSonda = new StatoSonda();
		boolean esito_batch = false;
		if(super.getParam().getDatiCheck().containsKey("esito_batch")) {
			String esitoBatchString = (String) super.getParam().getDatiCheck().getProperty("esito_batch");
			try{
				esito_batch = Boolean.parseBoolean(esitoBatchString);
			} catch(NumberFormatException e){
				e.printStackTrace(System.err);
				System.err.println("Errore durante il parsing del parametro esito_batch: " + super.getParam().getDatiCheck().getProperty("esito_batch") + ". Elimino il valore");
				super.getParam().getDatiCheck().remove("esito_batch");
			}
		} else {
			System.err.println("Parametro esito_batch non trovato");
		}

		Long dataUltimoBatchLong = null;
		if(super.getParam().getDatiCheck().containsKey("data_ultimo_batch")) {
			try {
				
				dataUltimoBatchLong = Long.valueOf(super.getParam().getDatiCheck().getProperty("data_ultimo_batch"));
			} catch(NumberFormatException e) {
				e.printStackTrace(System.err);
				System.err.println("Errore durante il parsing del parametro data_ultimo_batch: " + super.getParam().getDatiCheck().getProperty("data_ultimo_batch") + ". Elimino il valore");
				super.getParam().getDatiCheck().remove("data_ultimo_batch");
			}
		} else {
			System.err.println("Parametro data_ultimo_batch non trovato");
		}

		if(dataUltimoBatchLong == null) {
			statoSonda.setStato(2);
			statoSonda.setDescrizione("Il batch "+super.getParam().getNome()+" risulta non essere eseguito.");
			return statoSonda;
		}

		Date data_ultimo_batch = new Date(dataUltimoBatchLong);

		SimpleDateFormat format = new SimpleDateFormat(PATTERN);
		String dataUltimoBatchString = format.format(data_ultimo_batch);
		
		if(esito_batch) {

			//Valuto l'eventuale superamento delle soglie e calcolo lo stato
			if(data_ultimo_batch.before(data_err)) {
				String errorDateFormatted = format.format(data_err);
				statoSonda.setStato(2);
				statoSonda.setDescrizione("Il batch "+super.getParam().getNome()+" risulta non essere eseguito dal "+dataUltimoBatchString+". Data di error ("+errorDateFormatted+") superata.");
			} else if(data_ultimo_batch.before(data_warn)) {
				String warnDateFormatted = format.format(data_warn);
				statoSonda.setStato(1);
				statoSonda.setDescrizione("Il batch "+super.getParam().getNome()+" risulta non essere eseguito dal "+dataUltimoBatchString+". Data di warn ("+warnDateFormatted+") superata.");
			} else {
				statoSonda.setStato(0);
				statoSonda.setDescrizione("Batch "+super.getParam().getNome()+" eseguito con successo il "+dataUltimoBatchString+".");
			}
	 
			return statoSonda;
		} else {
			
			Integer interazioniFallite = -1;
			if(super.getParam().getDatiCheck().containsKey("interazioni_fallite")) {
				try{
					interazioniFallite = Integer.parseInt(super.getParam().getDatiCheck().getProperty("interazioni_fallite"));
				} catch(NumberFormatException e) {
					e.printStackTrace(System.err);
					System.err.println("Errore durante il parsing del parametro interazioni_fallite: " + super.getParam().getDatiCheck().getProperty("interazioni_fallite") + ". Elimino il valore");
					super.getParam().getDatiCheck().remove("interazioni_fallite");
				}
			} else {
				System.err.println("Parametro interazioni_fallite non trovato");
			}

			statoSonda.setStato(2);
			String descr = null;
			if(super.getParam().getDatiCheck().containsKey("descrizione_errore")) {
				descr = new String(Base64Utilities.decode((String) super.getParam().getDatiCheck().get("descrizione_errore")));
			}
			statoSonda.setDescrizione("Il batch "+super.getParam().getNome()+" risulta fallire dal "+dataUltimoBatchString+" (fallite "+interazioniFallite+" iterazioni). Descrizione dell'ultimo errore:" + descr);
			return statoSonda;
		}
	}

	
	//retrocompatibilita
	public StatoSonda aggiornaStatoSonda(boolean esito_batch, Date data_ultimo_batch, String descrizioneErrore, Connection connection, TipiDatabase tipoDatabase) throws SondaException {
		return this.aggiornaStatoSonda(esito_batch, null, data_ultimo_batch, descrizioneErrore, connection, tipoDatabase);
	}
	
	/**
	 * @param esito_batch true se l'esito e' positivo, false altrimenti
	 * @param data_ultimo_batch ultima data di esecuzione del batch 
	 * @param descrizioneErrore eventuale descrizione dell'errore (in caso di esito negativo)
	 * @param connection connessione per il DB
	 * @param tipoDatabase tipo database
	 * @return lo stato attuale della sonda
	 * @throws SondaException
	 */
	public StatoSonda aggiornaStatoSonda(boolean esito_batch, Properties params, Date data_ultimo_batch, String descrizioneErrore, Connection connection, TipiDatabase tipoDatabase) throws SondaException {
		// inserisce i dati nel properties
		
		super.getParam().putAllCheck(params);
		
		super.getParam().getDatiCheck().put("data_ultimo_batch", data_ultimo_batch.getTime()+ "");
		super.getParam().getDatiCheck().put("esito_batch", String.valueOf(esito_batch));
		if(!esito_batch) {
			if(super.getParam().getDatiCheck().containsKey("interazioni_fallite")) {
				Integer interazioniFallite = Integer.parseInt(super.getParam().getDatiCheck().getProperty("interazioni_fallite"));
				super.getParam().getDatiCheck().put("interazioni_fallite", (interazioniFallite+1) + "");
			} else {
				super.getParam().getDatiCheck().put("interazioni_fallite", 1 + "");
			}
			if(descrizioneErrore != null) {
				super.getParam().getDatiCheck().put("descrizione_errore", Base64Utilities.encodeAsString(descrizioneErrore.getBytes()));
			}
		} else {
			if(super.getParam().getDatiCheck().containsKey("descrizione_errore"))
				super.getParam().getDatiCheck().remove("descrizione_errore");
			if(super.getParam().getDatiCheck().containsKey("interazioni_fallite"))
				super.getParam().getDatiCheck().remove("interazioni_fallite");
		}
		return updateSonda(connection, tipoDatabase);
	}

}