/** * 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; } }