From ecb2e6b32cddc12f10f073f3c8a74cc4198bc541 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?L=C3=A4sp=C3=A4=20Vili=20Valtteri?=
 <vili.v.laspa@student.jyu.fi>
Date: Sat, 29 Mar 2025 23:53:00 +0200
Subject: [PATCH] tulosten tallentaminen tiedostoon alku

---
 puntti/batman/tulokset.dat               |  24 ++++++
 puntti/src/puntti/Tulokset.java          | 105 ++++++++++++++++++++++-
 puntti/src/puntti/Tulos.java             |  55 ++++++++++++
 puntti/src/puntti/test/TuloksetTest.java |  61 ++++++++++---
 puntti/src/puntti/test/TulosTest.java    |  36 ++++++--
 5 files changed, 265 insertions(+), 16 deletions(-)
 create mode 100644 puntti/batman/tulokset.dat

diff --git a/puntti/batman/tulokset.dat b/puntti/batman/tulokset.dat
new file mode 100644
index 0000000..783a484
--- /dev/null
+++ b/puntti/batman/tulokset.dat
@@ -0,0 +1,24 @@
+1|1|38|23.09.2015
+2|2|92|14.02.2014
+3|2|76|23.11.2003
+4|2|28|15.10.2001
+5|1|97|18.10.2011
+6|2|45|14.05.2007
+7|2|89|09.07.2022
+8|2|91|13.11.2019
+9|1|97|22.10.2021
+10|2|91|12.01.2012
+11|2|95|20.04.2020
+12|2|44|18.06.2005
+13|1|31|22.01.2004
+14|2|89|05.04.2022
+15|2|95|21.10.2001
+16|2|73|26.11.2021
+17|1|68|23.11.2004
+18|2|36|21.03.2006
+19|2|59|14.02.2013
+20|2|86|24.06.2025
+21|1|36|24.09.2020
+22|2|77|15.06.2009
+23|2|72|03.06.2021
+24|2|77|08.09.2009
diff --git a/puntti/src/puntti/Tulokset.java b/puntti/src/puntti/Tulokset.java
index e41f673..ac739c8 100644
--- a/puntti/src/puntti/Tulokset.java
+++ b/puntti/src/puntti/Tulokset.java
@@ -1,8 +1,15 @@
 package puntti;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Scanner;
 
 /**
  * |------------------------------------------------------------------------|
@@ -19,7 +26,7 @@ import java.util.List;
  * @version 11.3.2025
  *
  */
-public class Tulokset {
+public class Tulokset implements Iterable<Tulos>{
     
     private Collection<Tulos> alkiot = new ArrayList<Tulos>();
     
@@ -74,8 +81,87 @@ public class Tulokset {
     }
     
     
+    @Override
+    public Iterator<Tulos> iterator() {
+        return alkiot.iterator();
+    }
     
     
+    /**
+     * Lukee liikkeen tulokset tiedostosta
+     * @param hakemisto tiedoston hakemisto
+     * @throws SailoException jos lukeminen ei onnistu
+     * @example
+     * <pre name="test">
+     * #THROWS SailoException 
+     * #import java.io.File;
+     *  Tulokset tuulokset = new Tulokset();
+     *  Tulos penkki1 = new Tulos(); penkki1.taytaPenkkiTulos(2);
+     *  Tulos penkki2 = new Tulos(); penkki2.taytaPenkkiTulos(1);
+     *  Tulos penkki3 = new Tulos(); penkki3.taytaPenkkiTulos(2);
+     *  Tulos penkki4 = new Tulos(); penkki4.taytaPenkkiTulos(1);
+     *  Tulos penkki5 = new Tulos(); penkki5.taytaPenkkiTulos(2);
+     *  String kayttajaNimi = "testibatman";
+     *  File tiedosto = new File(kayttajaNimi + "/tulokset.dat");
+     *  tiedosto.delete();
+     *  tuulokset.lueTiedostosta(kayttajaNimi); #THROWS SailoException
+     *  tuulokset.lisaa(penkki1);
+     *  tuulokset.lisaa(penkki2);
+     *  tuulokset.lisaa(penkki3);
+     *  tuulokset.lisaa(penkki4);
+     *  tuulokset.lisaa(penkki5);
+     *  tuulokset.tallenna(kayttajaNimi);
+     *  tuulokset = new Tulokset();
+     *  tuulokset.lueTiedostosta(kayttajaNimi);
+     *  Iterator<Tulos> i = tuulokset.iterator();
+     *  i.next().toString() === penkki1.toString();
+     *  i.next().toString() === penkki2.toString();
+     *  i.next().toString() === penkki3.toString();
+     *  i.next().toString() === penkki4.toString();
+     *  i.next().toString() === penkki5.toString();
+     *  i.hasNext() === false;
+     *  tuulokset.lisaa(penkki5);
+     *  tuulokset.tallenna(kayttajaNimi);
+     *  tiedosto.delete() === true;
+     * </pre>
+     */
+    public void lueTiedostosta(String hakemisto) throws SailoException{
+      String tiedNimi = hakemisto +"/tulokset.dat";
+      File tiedosto = new File(tiedNimi);
+      
+      try (Scanner fi = new Scanner(new FileInputStream(tiedosto))){
+          while(fi.hasNext()) {
+              String s = fi.nextLine().trim();
+              if ("".equals(s) || s.charAt(0) == ';') continue;
+              Tulos tulos = new Tulos();
+              tulos.parse(s);
+              lisaa(tulos);
+          }
+      }catch (FileNotFoundException e ) {
+          throw new SailoException("Ei saa luettua tiedostoa " + tiedNimi);
+      }
+      
+    }
+    
+    
+    
+    /**
+     * @param hakemisto mihin hakemistoon tehdään uusi tiedosto
+     * @throws SailoException jos tallentaminen ei onnistu
+     */
+    public void tallenna(String hakemisto) throws SailoException {
+        File tiedosto = new File(hakemisto + "/tulokset.dat");
+        try (PrintStream fo = new PrintStream(new FileOutputStream(tiedosto, false))){
+                for (var tulo: alkiot) {
+                    fo.println(tulo.toString());
+                }
+                
+        }catch (FileNotFoundException e) {
+        
+            throw new SailoException("Tiedosto "+ tiedosto.getAbsolutePath() + " ei löydy");
+        }
+    }
+    
     /**
      * Testiohjelma tulokset luokalle
      * @param args ei kaytossa
@@ -83,14 +169,25 @@ public class Tulokset {
     public static void main(String[] args) {
         
         Tulokset tuulokset = new Tulokset();
+        
+        try {
+            tuulokset.lueTiedostosta("batman");
+        } catch (SailoException ex ) {
+            System.err.println(ex.getMessage());
+        }
+        
         Tulos penkki1 = new Tulos();
         penkki1.taytaPenkkiTulos(1);
+        penkki1.lisaaTulos();
         Tulos penkki2 = new Tulos();
         penkki2.taytaPenkkiTulos(2);
+        penkki2.lisaaTulos();
         Tulos penkki3 = new Tulos();
         penkki3.taytaPenkkiTulos(2);
+        penkki3.lisaaTulos();
         Tulos penkki4 = new Tulos();
         penkki4.taytaPenkkiTulos(2);
+        penkki4.lisaaTulos();
         
         tuulokset.lisaa(penkki1);
         tuulokset.lisaa(penkki2);
@@ -105,6 +202,12 @@ public class Tulokset {
             System.out.println(tulo.getLid() + " ");
             tulo.tulosta(System.out);
         }
+        
+        try {
+            tuulokset.tallenna("batman");
+        } catch (SailoException e ) {
+            e.printStackTrace();
+        }
     }
 
 
diff --git a/puntti/src/puntti/Tulos.java b/puntti/src/puntti/Tulos.java
index c3988fe..fe32077 100644
--- a/puntti/src/puntti/Tulos.java
+++ b/puntti/src/puntti/Tulos.java
@@ -2,6 +2,7 @@ package puntti;
 
 import java.io.PrintStream;
 
+import fi.jyu.mit.ohj2.Mjonot;
 import testaus.ErilaisetArvonnat;
 
 /**
@@ -119,6 +120,60 @@ public class Tulos {
    
     
     
+    /**
+     * Asettaa id ja varmistaa että
+     * seuraava numero on suurempi kuin tähän mennessä suurin.
+     * @param numero asetettava id
+     */
+    private void setId(int numero) {
+        id = numero;
+        if (id >= seuraavaId) seuraavaId = id + 1;
+    }
+    
+    
+    /**
+     * erottelee tiedostosta luetulta rivitä tiedot
+     * @param rivi josta erotellaan liikkeen tuloksen tiedot
+     * @example
+     * <pre name="test">
+     *  Tulos tulos = new Tulos();
+     *  tulos.parse("2| 7 | 120 | 20.12.2025");
+     *  tulos.getLid() === 7;
+     *  tulos.toString() === "2|7|120|20.12.2025";
+     *
+     *   tulos.lisaaTulos();
+     *   int n = tulos.getId();
+     *   tulos.parse(""+(n+20));      
+     *   tulos.lisaaTulos();          
+     *   tulos.getId() === n+20+1;
+     *     
+     * </pre>
+     */
+    public void parse(String rivi) {
+        var sb = new StringBuilder(rivi);
+        setId(Mjonot.erota(sb, '|', getId()));
+        lid = Mjonot.erota(sb, '|', lid);
+        tulos = Mjonot.erota(sb, '|', tulos);
+        paivamaara = Mjonot.erota(sb, '|', paivamaara);
+    }
+    
+    
+    
+    /**
+     * palauttaa liikkeen tiedot merkkijonona jonka voi tallentaa tiedostoon.
+     * @return tulos tolppaeroteltuna merkkijonona
+     * @example
+     * <pre name="test">
+     *  Tulos tulos = new Tulos();
+     *  tulos.parse("2| 7 | 120 | 20.12.2025");
+     *  tulos.toString() === "2|7|120|20.12.2025";
+     *  </pre>
+     */
+    @Override
+    public String toString() {
+        return "" + getId() + "|" + getLid() + "|" + tulos + "|" + paivamaara;
+                
+    }
 
     /**
      * Testiohjelma Tulokselle
diff --git a/puntti/src/puntti/test/TuloksetTest.java b/puntti/src/puntti/test/TuloksetTest.java
index d763296..f2455e5 100644
--- a/puntti/src/puntti/test/TuloksetTest.java
+++ b/puntti/src/puntti/test/TuloksetTest.java
@@ -1,6 +1,7 @@
 package puntti.test;
 // Generated by ComTest BEGIN
 import java.util.*;
+import java.io.File;
 import static org.junit.Assert.*;
 import org.junit.*;
 import puntti.*;
@@ -8,18 +9,17 @@ import puntti.*;
 
 /**
  * Test class made by ComTest
- * @version 2025.03.12 14:08:50 // Generated by ComTest
+ * @version 2025.03.29 23:50:32 // Generated by ComTest
  *
  */
 @SuppressWarnings("all")
 public class TuloksetTest {
 
 
-
   // Generated by ComTest BEGIN
-  /** testAnnaTulokset46 */
+  /** testAnnaTulokset53 */
   @Test
-  public void testAnnaTulokset46() {    // Tulokset: 46
+  public void testAnnaTulokset53() {    // Tulokset: 53
     Tulokset tuulokset = new Tulokset(); 
     Tulos penkki1 = new Tulos(2); tuulokset.lisaa(penkki1); 
     Tulos penkki2 = new Tulos(1); tuulokset.lisaa(penkki2); 
@@ -29,13 +29,54 @@ public class TuloksetTest {
     Tulos penkki6 = new Tulos(4); tuulokset.lisaa(penkki6); 
     List<Tulos> loytyneet; 
     loytyneet = tuulokset.annaTulokset(3); 
-    assertEquals("From: Tulokset line: 59", 0, loytyneet.size()); 
+    assertEquals("From: Tulokset line: 66", 0, loytyneet.size()); 
     loytyneet = tuulokset.annaTulokset(1); 
-    assertEquals("From: Tulokset line: 61", 2, loytyneet.size()); 
-    assertEquals("From: Tulokset line: 62", true, loytyneet.get(0) == penkki2); 
-    assertEquals("From: Tulokset line: 63", true, loytyneet.get(1) == penkki4); 
+    assertEquals("From: Tulokset line: 68", 2, loytyneet.size()); 
+    assertEquals("From: Tulokset line: 69", true, loytyneet.get(0) == penkki2); 
+    assertEquals("From: Tulokset line: 70", true, loytyneet.get(1) == penkki4); 
     loytyneet = tuulokset.annaTulokset(4); 
-    assertEquals("From: Tulokset line: 65", 1, loytyneet.size()); 
-    assertEquals("From: Tulokset line: 66", true, loytyneet.get(0) == penkki6); 
+    assertEquals("From: Tulokset line: 72", 1, loytyneet.size()); 
+    assertEquals("From: Tulokset line: 73", true, loytyneet.get(0) == penkki6); 
+  } // Generated by ComTest END
+
+
+  // Generated by ComTest BEGIN
+  /** 
+   * testLueTiedostosta95 
+   * @throws SailoException when error
+   */
+  @Test
+  public void testLueTiedostosta95() throws SailoException {    // Tulokset: 95
+    Tulokset tuulokset = new Tulokset(); 
+    Tulos penkki1 = new Tulos(); penkki1.taytaPenkkiTulos(2); 
+    Tulos penkki2 = new Tulos(); penkki2.taytaPenkkiTulos(1); 
+    Tulos penkki3 = new Tulos(); penkki3.taytaPenkkiTulos(2); 
+    Tulos penkki4 = new Tulos(); penkki4.taytaPenkkiTulos(1); 
+    Tulos penkki5 = new Tulos(); penkki5.taytaPenkkiTulos(2); 
+    String kayttajaNimi = "testibatman"; 
+    File tiedosto = new File(kayttajaNimi + "/tulokset.dat"); 
+    tiedosto.delete(); 
+    try {
+    tuulokset.lueTiedostosta(kayttajaNimi); 
+    fail("Tulokset: 107 Did not throw SailoException");
+    } catch(SailoException _e_){ _e_.getMessage(); }
+    tuulokset.lisaa(penkki1); 
+    tuulokset.lisaa(penkki2); 
+    tuulokset.lisaa(penkki3); 
+    tuulokset.lisaa(penkki4); 
+    tuulokset.lisaa(penkki5); 
+    tuulokset.tallenna(kayttajaNimi); 
+    tuulokset = new Tulokset(); 
+    tuulokset.lueTiedostosta(kayttajaNimi); 
+    Iterator<Tulos> i = tuulokset.iterator(); 
+    assertEquals("From: Tulokset line: 117", penkki1.toString(), i.next().toString()); 
+    assertEquals("From: Tulokset line: 118", penkki2.toString(), i.next().toString()); 
+    assertEquals("From: Tulokset line: 119", penkki3.toString(), i.next().toString()); 
+    assertEquals("From: Tulokset line: 120", penkki4.toString(), i.next().toString()); 
+    assertEquals("From: Tulokset line: 121", penkki5.toString(), i.next().toString()); 
+    assertEquals("From: Tulokset line: 122", false, i.hasNext()); 
+    tuulokset.lisaa(penkki5); 
+    tuulokset.tallenna(kayttajaNimi); 
+    assertEquals("From: Tulokset line: 125", true, tiedosto.delete()); 
   } // Generated by ComTest END
 }
\ No newline at end of file
diff --git a/puntti/src/puntti/test/TulosTest.java b/puntti/src/puntti/test/TulosTest.java
index 054afff..836b5f2 100644
--- a/puntti/src/puntti/test/TulosTest.java
+++ b/puntti/src/puntti/test/TulosTest.java
@@ -7,7 +7,7 @@ import puntti.*;
 
 /**
  * Test class made by ComTest
- * @version 2025.03.12 12:08:14 // Generated by ComTest
+ * @version 2025.03.29 23:52:24 // Generated by ComTest
  *
  */
 @SuppressWarnings("all")
@@ -16,16 +16,42 @@ public class TulosTest {
 
 
   // Generated by ComTest BEGIN
-  /** testLisaaTulos82 */
+  /** testLisaaTulos83 */
   @Test
-  public void testLisaaTulos82() {    // Tulos: 82
+  public void testLisaaTulos83() {    // Tulos: 83
     Tulos penkki = new Tulos(); 
-    assertEquals("From: Tulos line: 84", 0, penkki.getId()); 
+    assertEquals("From: Tulos line: 85", 0, penkki.getId()); 
     penkki.lisaaTulos(); 
     Tulos penkki2 = new Tulos(); 
     penkki2.lisaaTulos(); 
     int n1 = penkki.getId(); 
     int n2 = penkki2.getId(); 
-    assertEquals("From: Tulos line: 90", n2-1, n1); 
+    assertEquals("From: Tulos line: 91", n2-1, n1); 
+  } // Generated by ComTest END
+
+
+  // Generated by ComTest BEGIN
+  /** testParse138 */
+  @Test
+  public void testParse138() {    // Tulos: 138
+    Tulos tulos = new Tulos(); 
+    tulos.parse("2| 7 | 120 | 20.12.2025"); 
+    assertEquals("From: Tulos line: 141", 7, tulos.getLid()); 
+    assertEquals("From: Tulos line: 142", "2|7|120|20.12.2025", tulos.toString()); 
+    tulos.lisaaTulos(); 
+    int n = tulos.getId(); 
+    tulos.parse(""+(n+20)); 
+    tulos.lisaaTulos(); 
+    assertEquals("From: Tulos line: 148", n+20+1, tulos.getId()); 
+  } // Generated by ComTest END
+
+
+  // Generated by ComTest BEGIN
+  /** testToString166 */
+  @Test
+  public void testToString166() {    // Tulos: 166
+    Tulos tulos = new Tulos(); 
+    tulos.parse("2| 7 | 120 | 20.12.2025"); 
+    assertEquals("From: Tulos line: 169", "2|7|120|20.12.2025", tulos.toString()); 
   } // Generated by ComTest END
 }
\ No newline at end of file
-- 
GitLab