import java.io.*;

import java.util.*;

import java.net.*;

 

public class verificaServer extends Thread

{

  private static String LogFile="Registrazioni.log";

  ListaFile serverReg=new ListaFile();

  final int Porta_dati=1189;

 

 

  public verificaServer(ListaFile lf)

  {

     serverReg=lf;

  }

 

  public verificaServer()

  {

  }

 

  public void run()

  {

     try

     {

     long inizio,cicli_di_verifica=1;

     //valore in millisecondi

     long attesa=60000;

     boolean aggiornamento_necessario=false;

     ListaFile temp=new ListaFile();

    String messaggio=new String();

  FileWriter scrittoreLog;

 

     inizio=(new Date()).getTime();

     scrittoreLog=new FileWriter(LogFile,true);

    

     System.out.println("Verificatore stato dei server partito");

    

     while(true)

     {

       //condizione di inizio verifica (ogni minuto)

       if(((new Date()).getTime())>=(inizio+(attesa*cicli_di_verifica)))

       {

          System.out.println("ciclo verifica numero "+cicli_di_verifica);

          synchronized(serverReg)

          {

          for(int j=0;j<serverReg.lista_server.length;)

          {

            if(serverReg.lista_server[j]==null)

            {

              if(j==0){System.out.println("Nessun server attivo in questo momento");}

              break;

            }

           

            try

            {

              if(j==0)System.out.println("inizio verifica dei server registrati");

              Socket sock=new Socket(serverReg.lista_server[j],Porta_dati);

              sock.setSoLinger(true,180);

              sock.setSoTimeout(180000);

              ObjectOutputStream oos=new ObjectOutputStream(sock.getOutputStream());

           ObjectInputStream ois=new ObjectInputStream(sock.getInputStream());

              oos.writeObject("ancora attivo?");

              oos.flush();

              messaggio=(String)ois.readObject();

              System.out.println("server "+serverReg.lista_server[j]+" ancora attivo");

              //incremento qui il contatore perchč se un server non risponde lo elimino dalla

              //lista, quindi ho un elemento in meno e cosė salterei l' ultimo server da

              //contattare per la verifica

              j++;

            }//try (OK)

         catch(Exception e)

         {

          //se ho un errore nella comunicazione presumo che il server non sia pių attivo

          temp.cancella();

          System.out.println("il server "+serverReg.lista_server[j]+" non risponde");

          System.out.println("cancello il server "+serverReg.lista_server[j]+" dalla lista");

          scrittoreLog.write("il server "+serverReg.lista_server[j]+" non risponde\r\n");

          scrittoreLog.write("cancello il server "+serverReg.lista_server[j]+" dalla lista\r\n");

         

          for(int h=0,k=0;h<serverReg.lista_server.length;h++)

          {

             if(serverReg.lista_server[h]==null)

              {

                 break;

              }

            if(!(serverReg.lista_server[h].equals(serverReg.lista_server[j])))

               {

                temp.lista_server[k]=new String(serverReg.lista_server[h]);

                //System.out.println(temp.lista_server[k]);

                for(int g=0;g<serverReg.lista_file_server[h].length;g++)

                {

                   if(serverReg.lista_file_server[h][g]==null)break;

                   temp.lista_file_server[k][g]=new String(serverReg.lista_file_server[h][g]);

                }

                k++;

               }

            }                      

            //aggiorno la struttura serverReg

            serverReg.cancella();

            serverReg=temp.copia();

            aggiornamento_necessario=true;

           }//catch

            }//for

         

          for(int cont=0;((cont<serverReg.lista_server.length)&&(aggiornamento_necessario));cont++)

          {

           if(serverReg.lista_server[cont]==null)

           {

             if(cont!=0)

             {

              System.out.println("Fine aggiornamento dei server registrati");

              scrittoreLog.write("Fine aggiornamento dei server registrati\r\n");

              scrittoreLog.flush();

             }

            aggiornamento_necessario=false;

             break;

           }

           else

           {

            try

            {

              new Thread(new aggiornaFTP(serverReg.lista_server[cont],serverReg)).start();

            }

            catch(Exception ex)

            {

               System.out.println("Errore durante l\' aggiornamento dei server");

               System.out.println(ex);

            }

           }//else

          }

          }//synchro 

          cicli_di_verifica++;

       }//if

     }//while

  }

  catch(Exception e)

  {

     System.out.println("Errore generale durante l'avvio del server che verifica le connessioni");

     System.out.println(e);

  }

  }

}