

/**
 * Title:
 * Description:
 * Copyright:    Copyright (c) 2002
 * Company:
 * @author
 * @version 1.0
 */
import java.util.*;
import java.io.*;
import java.net.*;

public class DataReader2 extends Thread{

    Kilpailu kilp;
    String id;
    OLiveResults olr;
    int demowait;




    private BufferedReader in2;
    int viime = 0;
    int lines = 0;
    String uusin = "0";
    int status = 0;
    String statusaika = "0";
    boolean paivitetty=false;


    public DataReader2(Kilpailu ikilp, String iid, String imyemail, String imygsm, OLiveResults iolr, int idemowait) {
        kilp = ikilp;
        id  = iid;
        olr  =iolr;
        demowait = idemowait;
    }

    public void run()
    {


    kilp.monitor("yritetään ladata lähtölistoja");
        //lähtölistan luku
        InputStream in = null;
        Reader reader = null;
        BufferedReader breader = null;
        try {
          //luodaan binäärivirta tiedostosta lukemista varten
          in = (new URL("http://www.suunnistus.info/files/pekka.varis/"+id+".txt").openStream());
          //in = (new URL("http://www.suunnistus.net/pekkavaris/scoreboard/apu.php").openStream());
          //luodaan merkkivirta, joka lukee merkit binäärivirrasta käyttäen
          //annettua merkistöä.
          reader = new InputStreamReader(in);
          //puskuroidaan virta
          breader = new BufferedReader(reader);
          String rivi = null;
          //BufferedReader-luokalla on metodi rivien lukemiseen
         String sarja = "";
         String matka = "";
         String data = "";
         kilp.monitor("ladataan lähtölistoja");
          while((rivi=breader.readLine()) != null){
             if(rivi.startsWith("SARJA;"))
             {
                if(!sarja.equals("") && !data.equals("")) {
                  kilp.teeSarja(sarja,matka,data);
		  }

                if(rivi.length()>6)
                {
                  sarja = rivi.substring(6).trim();
                  while(sarja.endsWith(";")) sarja = sarja.substring(0,sarja.length()-1);
                   if (sarja.indexOf(';')>0)
                      {
                        matka = sarja.substring(sarja.indexOf(';')+1);
                        sarja = sarja.substring(0,sarja.indexOf(';'));
                      }
                    else matka = "";
                }
               data = "";
	       //kilp.monitor(sarja);

             }
             else if (rivi.length()>10) data += rivi +"\n";

            }

            if(!sarja.equals("") && !data.equals("")) {
                  kilp.teeSarja(sarja,matka,data);
		  kilp.monitor(sarja);
		  }

            //kilp.naytaSarjaLista();
          }

        catch ( Exception e ) {
            kilp.monitor("lähtölistoja ei saatavissa");
        }
        finally {
          //suljetaan virta
          try {
            if (breader != null) breader.close();
            } catch(IOException ioe) {}
        }




	InputStream  url;
	String str;

        lines = 0;
        boolean onnistuiko = false;
        for(int i=0;i<5;i++)
        {
	  try {
                kilp.monitor("avataan yhteyttä...");
		url= (new URL("http://www.suunnistus.info/files/pirilahk/data/"+id+"/outmsg.txt").openStream());
     		InputStreamReader in3 = new InputStreamReader(url);
                in2     = new BufferedReader(in3);
                onnistuiko =true;
                break;
               }
               catch (Exception ex)
               {
                     try {if (in2 != null) {in2.close(); }} catch(IOException ioe) {}
                     System.out.println("epäonnistunut kättely:"+i);
                     ex.printStackTrace();
                     // 5 sekunnnin tauko kättely-yritysten välillä
                     for(int j =5;j>0;j--)
                    {
                        kilp.monitor("ei saada yhteyttä... uusi yritys "+j+"..." );
                        try{sleep(1000);}catch(Exception ex1) {ex1.printStackTrace();break;}
                    }
               }

        }

        if(!onnistuiko)
        {
               kilp.monitor("yhteyden muodostaminen epäonnistui... aloita valikosta uudelleen");
               return;
        }


  try {

                    //kilp.monitor("yhteys muodostettu");
                    kilp.monitor("luetaan tähänastisia tietoja");
                    while (!this.isInterrupted()) {
                                    str = in2.readLine();
                                    lines++;
                                    if(lines>viime)
                                     if(str!=null){
                                       if(!str.startsWith("#") && str.length()>20)
                                          if(analysoiData(str,(paivitetty || lines>status)) && !paivitetty)
                                            {kilp.naytaSarjaLista(); paivitetty = true; kilp.monitor("odotetaan uusia tietoja");}



                                     if (str.startsWith("OK") ) break;  // loppu ???
                                     viime = lines;
                                                  try
                                                    {
                                                        double a = Math.random()*1000*demowait;
                                                        int b = (int)a;
                                                        if(!paivitetty) b=0;

                                                        yield();
                                                        Thread.sleep(b);
                                                    }
                                                    catch(InterruptedException _ex)
                                                    {
                                                       try {if (in2 != null){ in2.close();}} catch(IOException ioe) {}
                                                       break;
                                                    }

                                     }
                                    }

          try {if (in2 != null) {in2.close();}} catch(IOException ioe) {}
          kilp.monitor("yhteyden avaaminen ei onnistu (3)");

    }
    catch (Exception e) {
          try {if (in2 != null) {in2.close(); }} catch(IOException ioe) {}
          if(kilp!=null) kilp.monitor("yhteys katkennut");
          e.printStackTrace();
    }

}

private boolean analysoiData(String data, boolean istatus)
    {
        data = korvaa(data,";;","; ;");
        try{
               StringTokenizer st1 = new StringTokenizer(data,";");
               st1.nextToken();
               String aikaleima = st1.nextToken();
               if(aikaleima.compareTo(uusin)<0)
               return false;
               uusin = aikaleima;
               String sarja = st1.nextToken();
               String matka = st1.nextToken();
               int nro = Integer.parseInt(st1.nextToken());
               String nimi = st1.nextToken() + " " + st1.nextToken();
               String seura = st1.nextToken();
               String aika= st1.nextToken();
               int aikasek = Integer.parseInt(st1.nextToken());
               kilp.lisaaData(aikaleima,sarja,matka,nro,nimi,seura,aika,aikasek,(istatus || aikaleima.compareTo(statusaika)>0));
               return(istatus || aikaleima.compareTo(statusaika)>0);

           }

           catch(Exception e) {
            e.printStackTrace();
            System.out.println("ongelma:\n"+data);
            return false;
           }

    }

    private static String korvaa(String aSearch, String aFind, String aReplace)


    {
    String result = aSearch;
    if (result != null && result.length() > 0)
        {
        int a = 0;
        int b = 0;
        while (true)
            {
            a = result.indexOf(aFind, b);
            if (a != -1)
                {
                result = result.substring(0, a) + aReplace + result.substring(a + aFind.length());
                b = a + aReplace.length();
            }
            else
            break;
        }
    }
    return result;
}

}






