it.govpay.web.rs.Check.java Source code

Java tutorial

Introduction

Here is the source code for it.govpay.web.rs.Check.java

Source

/*
 * GovPay - Porta di Accesso al Nodo dei Pagamenti SPC 
 * http://www.gov4j.it/govpay
 * 
 * Copyright (c) 2014-2017 Link.it srl (http://www.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 it.govpay.web.rs;

import it.govpay.bd.BasicBD;
import it.govpay.bd.anagrafica.AnagraficaManager;
import it.govpay.bd.anagrafica.DominiBD;
import it.govpay.bd.anagrafica.StazioniBD;
import it.govpay.bd.model.Dominio;
import it.govpay.bd.model.Stazione;
import it.govpay.bd.pagamento.NotificheBD;
import it.govpay.bd.pagamento.TracciatiBD;
import it.govpay.bd.pagamento.filters.TracciatoFilter;
import it.govpay.bd.wrapper.StatoNdP;
import it.govpay.core.business.Operazioni;
import it.govpay.core.utils.GovpayConfig;
import it.govpay.core.utils.GpContext;
import it.govpay.core.utils.GpThreadLocal;
import it.govpay.model.Tracciato.StatoTracciatoType;
import it.govpay.web.rs.sonde.CheckSonda;
import it.govpay.web.rs.sonde.DettaglioSonda;
import it.govpay.web.rs.sonde.DettaglioSonda.TipoSonda;
import it.govpay.web.rs.sonde.ElencoSonde;
import it.govpay.web.rs.sonde.SommarioSonda;

import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.apache.commons.io.IOUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;
import org.openspcoop2.generic_project.exception.NotFoundException;
import org.openspcoop2.generic_project.exception.ServiceException;
import org.openspcoop2.utils.logger.beans.proxy.Actor;
import org.openspcoop2.utils.logger.beans.proxy.Operation;
import org.openspcoop2.utils.logger.beans.proxy.Server;
import org.openspcoop2.utils.logger.beans.proxy.Service;
import org.openspcoop2.utils.logger.constants.proxy.FlowMode;
import org.openspcoop2.utils.sonde.ParametriSonda;
import org.openspcoop2.utils.sonde.Sonda;
import org.openspcoop2.utils.sonde.Sonda.StatoSonda;
import org.openspcoop2.utils.sonde.SondaException;
import org.openspcoop2.utils.sonde.SondaFactory;
import org.openspcoop2.utils.sonde.impl.SondaCoda;

@Path("/check")
public class Check {

    @GET
    @Path("/sonda")
    @Produces({ MediaType.APPLICATION_JSON })
    public Response verificaSonde() {
        BasicBD bd = null;
        Logger log = LogManager.getLogger();
        try {
            try {
                bd = BasicBD.newInstance(UUID.randomUUID().toString());

                List<CheckSonda> listaCheckSonda = CheckSonda.getListaCheckSonda();
                ElencoSonde elenco = new ElencoSonde();
                for (CheckSonda checkSonda : listaCheckSonda) {
                    SommarioSonda sommarioSonda = new SommarioSonda();
                    sommarioSonda.setNome(checkSonda.getName());
                    try {
                        Sonda sonda = getSonda(bd, checkSonda);
                        StatoSonda statoSonda = sonda.getStatoSonda();
                        sommarioSonda.setStato(statoSonda.getStato());
                        sommarioSonda.setDescrizioneStato(statoSonda.getDescrizione());
                    } catch (Throwable t) {
                        sommarioSonda.setStato(2);
                        sommarioSonda.setDescrizioneStato("Impossibile acquisire lo stato della sonda: " + t);
                        log.error("Impossibile acquisire lo stato della sonda", t);
                    }
                    elenco.getItems().add(sommarioSonda);
                }
                return Response.ok(elenco).build();
            } catch (ServiceException e) {
                log.error("Errore durante la verifica delle sonde", e);
                throw new Exception("Errore durante la verifica delle sonde");
            } finally {
                if (bd != null)
                    bd.closeConnection();
            }
        } catch (Exception e) {
            return Response.status(500).entity(e.getMessage()).build();
        }
    }

    private Sonda getSonda(BasicBD bd, CheckSonda checkSonda)
            throws SondaException, ServiceException, NotFoundException {
        Sonda sonda = SondaFactory.get(checkSonda.getName(), bd.getConnection(),
                bd.getJdbcProperties().getDatabase());
        if (sonda == null)
            throw new NotFoundException("Sonda con nome [" + checkSonda.getName() + "] non configurata");
        if (checkSonda.isCoda()) {
            long num = -1;
            if (Operazioni.check_ntfy.equals(checkSonda.getName())) {
                NotificheBD notBD = new NotificheBD(bd);
                num = notBD.countNotificheInAttesa();
            } else if (Operazioni.check_tracciati.equals(checkSonda.getName())) {
                TracciatiBD tracciatiBD = new TracciatiBD(bd);
                TracciatoFilter filter = tracciatiBD.newFilter();

                filter.addStatoTracciato(StatoTracciatoType.IN_CARICAMENTO);
                filter.addStatoTracciato(StatoTracciatoType.NUOVO);
                Calendar cal = Calendar.getInstance();
                cal.add(Calendar.HOUR, -6); //TODO parametrizzare

                filter.setDataCaricamentoMax(cal.getTime());
                num = tracciatiBD.count(filter);
            }
            ((SondaCoda) sonda).aggiornaStatoSonda(num, bd.getConnection(), bd.getJdbcProperties().getDatabase());
        }
        return sonda;
    }

    @GET
    @Path("/sonda/{nome}")
    @Produces({ MediaType.APPLICATION_JSON })
    public Response verificaSonda(@PathParam(value = "nome") String nome) {
        BasicBD bd = null;
        Logger log = LogManager.getLogger();
        try {
            try {
                bd = BasicBD.newInstance(UUID.randomUUID().toString());
                CheckSonda checkSonda = CheckSonda.getCheckSonda(nome);

                if (checkSonda == null)
                    return Response.status(404).entity("Sonda con nome [" + nome + "] non configurata").build();

                DettaglioSonda dettaglioSonda = null;
                try {
                    Sonda sonda = getSonda(bd, checkSonda);
                    dettaglioSonda = new DettaglioSonda(sonda.getClass());
                    ParametriSonda param = sonda.getParam();
                    dettaglioSonda.setNome(param.getNome());

                    StatoSonda statoSonda = sonda.getStatoSonda();
                    dettaglioSonda.setStato(statoSonda.getStato());
                    dettaglioSonda.setDescrizioneStato(statoSonda.getDescrizione());

                    if (statoSonda.getStato() == 0)
                        dettaglioSonda.setDurataStato(param.getDataOk());
                    if (statoSonda.getStato() == 1)
                        dettaglioSonda.setDurataStato(param.getDataWarn());
                    if (statoSonda.getStato() == 2)
                        dettaglioSonda.setDurataStato(param.getDataError());

                    dettaglioSonda.setDataUltimoCheck(param.getDataUltimoCheck());
                    dettaglioSonda.setSogliaError(param.getSogliaError());
                    dettaglioSonda.setSogliaWarn(param.getSogliaWarn());
                } catch (Throwable t) {
                    dettaglioSonda = new DettaglioSonda(TipoSonda.Sconosciuto);
                    dettaglioSonda.setNome(nome);
                    dettaglioSonda.setStato(2);
                    dettaglioSonda.setDescrizioneStato("Impossibile acquisire lo stato della sonda: " + t);
                    log.error("Impossibile acquisire lo stato della sonda", t);
                }
                return Response.ok(dettaglioSonda).build();
            } catch (Exception e) {
                log.error("Errore durante la verifica della sonda " + nome, e);
                throw new Exception("Errore durante la verifica della sonda " + nome);
            } finally {
                if (bd != null)
                    bd.closeConnection();
            }
        } catch (Exception e) {
            return Response.status(500).entity(e.getMessage()).build();
        }
    }

    @GET
    @Path("/db")
    public Response verificaDB() {
        BasicBD bd = null;
        Logger log = LogManager.getLogger();
        try {
            DominiBD dominiBD = null;
            try {
                bd = BasicBD.newInstance(UUID.randomUUID().toString());
                dominiBD = new DominiBD(bd);
                dominiBD.count(dominiBD.newFilter());
            } catch (Exception e) {
                log.error("Errore di connessione al database", e);
                throw new Exception("Errore di connessione al database");
            } finally {
                if (bd != null)
                    bd.closeConnection();
            }
            return Response.ok().build();

        } catch (Exception e) {
            return Response.status(500).entity(e.getMessage()).build();
        }
    }

    @GET
    @Path("/pdd")
    public Response verificaPDD(@QueryParam(value = "matchString") String matchString) {
        Logger log = LogManager.getLogger();
        try {
            try {
                URL url = GovpayConfig.getInstance().getUrlPddVerifica();
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                String checkResult = null;
                conn.connect();

                int responseCode = conn.getResponseCode();

                String bodyResponse = null;

                if (responseCode > 299) {
                    checkResult = "Ottenuto response code [" + responseCode + "] durante la connessione a [" + url
                            + "]";
                }

                if (matchString != null) {
                    checkResult = null;

                    if (responseCode < 300) {
                        if (conn.getInputStream() != null) {
                            bodyResponse = new String(
                                    conn.getInputStream() != null ? IOUtils.toByteArray(conn.getInputStream())
                                            : new byte[] {});
                        }
                    } else {
                        if (conn.getErrorStream() != null) {
                            bodyResponse = new String(
                                    conn.getErrorStream() != null ? IOUtils.toByteArray(conn.getErrorStream())
                                            : new byte[] {});
                        }
                    }

                    if (bodyResponse == null || !bodyResponse.contains(matchString))
                        checkResult = "Ottenuta risposta che non contiene la matchString [" + matchString
                                + "] durante la connessione a [" + url + "]";
                }

                if (checkResult != null)
                    throw new Exception(checkResult);

            } catch (Exception e) {
                log.error("Errore di connessione alla PDD", e);
                throw new Exception("Errore di connessione alla PDD: " + e.getMessage());
            }

            return Response.ok().build();
        } catch (Exception e) {
            return Response.status(500).entity(e.getMessage()).build();
        }
    }

    public class EsitoVerifica {
        private Date ultimo_aggiornamento;
        private Integer codice_stato;
        private String operazione_eseguita;
        private String errore_rilevato;

        public Integer getCodice_stato() {
            return codice_stato;
        }

        public void setCodice_stato(Integer codice_stato) {
            this.codice_stato = codice_stato;
        }

        public String getOperazione_eseguita() {
            return operazione_eseguita;
        }

        public void setOperazione_eseguita(String operazione_eseguita) {
            this.operazione_eseguita = operazione_eseguita;
        }

        public String getErrore_rilevato() {
            return errore_rilevato;
        }

        public void setErrore_rilevato(String errore_rilevato) {
            this.errore_rilevato = errore_rilevato;
        }

        public Date getUltimo_aggiornamento() {
            return ultimo_aggiornamento;
        }

        public void setUltimo_aggiornamento(Date ultimo_aggiornamento) {
            this.ultimo_aggiornamento = ultimo_aggiornamento;
        }

        @Override
        public String toString() {
            if (codice_stato == 0)
                return "OK";
            if (codice_stato == 1)
                return "WARN: STATO NON VERIFICATO";
            if (codice_stato == 2)
                return "FAIL: [" + operazione_eseguita + "] " + errore_rilevato;
            return "ERRORE!!";
        }
    }

    @GET
    @Path("/{codDominio}")
    public Response verificaDominioJson(@PathParam(value = "codDominio") String codDominio) {
        BasicBD bd = null;
        GpContext ctx = null;
        try {
            ctx = new GpContext();
            Service service = new Service();
            service.setName("Check");
            ctx.getTransaction().setService(service);

            Operation operation = new Operation();
            operation.setMode(FlowMode.INPUT_OUTPUT);
            operation.setName("VerificaDominio");
            ctx.getTransaction().setOperation(operation);

            Server server = new Server();
            server.setName(GpContext.GovPay);
            ctx.getTransaction().setServer(server);

            Actor to = new Actor();
            to.setName(GpContext.GovPay);
            to.setType(GpContext.TIPO_SOGGETTO_GOVPAY);
            ctx.getTransaction().setTo(to);

            ThreadContext.put("op", ctx.getTransactionId());
            GpThreadLocal.set(ctx);

            bd = BasicBD.newInstance(GpThreadLocal.get().getTransactionId());

            EsitoVerifica esito = new EsitoVerifica();
            try {
                DominiBD dominiBD = new DominiBD(bd);
                StazioniBD stazioniBD = new StazioniBD(bd);

                Dominio d = AnagraficaManager.getDominio(bd, codDominio);
                Stazione stazione = d.getStazione(bd);

                StatoNdP statoDominioNdp = dominiBD.getStatoNdp(d.getId());
                StatoNdP statoStazioneNdp = stazioniBD.getStatoNdp(stazione.getId());

                if (statoDominioNdp.getCodice() == null) {
                    esito.setCodice_stato(1);
                    esito.setErrore_rilevato("STATO NON VERIFICATO");
                    return Response.ok().entity(esito).build();
                }

                if (statoDominioNdp.getCodice().intValue() == 0 && statoStazioneNdp.getCodice() == null) {
                    esito.setCodice_stato(0);
                    return Response.ok().entity(esito).build();
                }

                if (statoDominioNdp.getCodice().intValue() == 0 && statoStazioneNdp.getCodice().intValue() == 0) {
                    esito.setCodice_stato(0);
                    return Response.ok().entity(esito).build();
                }

                if (statoDominioNdp.getCodice().intValue() == 0 && statoStazioneNdp.getCodice().intValue() != 0) {
                    esito.setCodice_stato(2);
                    esito.setUltimo_aggiornamento(statoStazioneNdp.getData());
                    esito.setOperazione_eseguita(statoStazioneNdp.getOperazione());
                    esito.setErrore_rilevato(statoStazioneNdp.getDescrizione());
                    return Response.status(500).entity(esito).build();
                }
                if (statoDominioNdp.getCodice().intValue() != 0) {
                    esito.setCodice_stato(2);
                    esito.setUltimo_aggiornamento(statoDominioNdp.getData());
                    esito.setOperazione_eseguita(statoDominioNdp.getOperazione());
                    esito.setErrore_rilevato(statoDominioNdp.getDescrizione());
                    return Response.status(500).entity(esito).build();
                }

            } catch (NotFoundException e) {
                return Response.status(404).build();
            }
            return Response.ok().build();
        } catch (ServiceException e) {
            return Response.status(500).entity(e.getMessage()).build();
        } finally {
            if (bd != null)
                bd.closeConnection();
            if (ctx != null)
                ctx.log();
        }
    }
}