From 03f24fbb5408a7c633588d7c500b02fe02eebe2f Mon Sep 17 00:00:00 2001
From: Erkki Kaila <ertaka@utu.fi>
Date: Wed, 22 Feb 2023 13:37:29 +0200
Subject: [PATCH] valmis versio

---
 KantaAsiakas.java                             |   5 ++
 Tuote.java                                    |  12 +++-
 VerkkokauppaIO.java                           |  52 +++++++++++++++---
 VirtuaalinenTuote.java                        |   5 ++
 asiakkaat.csv                                 |   3 -
 .../oop-demo4-esimerkit/Tuote.class           | Bin 1174 -> 1820 bytes
 .../oop-demo4-esimerkit/VerkkokauppaIO.class  | Bin 4284 -> 5623 bytes
 .../VirtuaalinenTuote.class                   | Bin 454 -> 1078 bytes
 .../oop-demo4-esimerkit/tuotteet.dat          | Bin 0 -> 267 bytes
 9 files changed, 66 insertions(+), 11 deletions(-)
 delete mode 100644 asiakkaat.csv
 create mode 100644 out/production/oop-demo4-esimerkit/tuotteet.dat

diff --git a/KantaAsiakas.java b/KantaAsiakas.java
index e883511..b9730f9 100644
--- a/KantaAsiakas.java
+++ b/KantaAsiakas.java
@@ -15,4 +15,9 @@ public class KantaAsiakas extends Asiakas{
     public void setAlennusprosentti(int alennusprosentti) {
         this.alennusprosentti = alennusprosentti;
     }
+
+    @Override
+    public String toString() {
+        return super.toString() + ", alennusprosentti: " + alennusprosentti;
+    }
 }
diff --git a/Tuote.java b/Tuote.java
index 884187e..36afbdd 100644
--- a/Tuote.java
+++ b/Tuote.java
@@ -1,4 +1,9 @@
-public class Tuote {
+import java.io.Serializable;
+
+public class Tuote implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
     private String nimi;
     private int saldo;
     private double hinta;
@@ -45,5 +50,10 @@ public class Tuote {
         if (hinta >= 0)
             this.hinta = hinta;
     }
+
+    @Override
+    public String toString() {
+        return nimi + " (" + hinta + " euroa), saldo: " + saldo;
+    }
 }
 
diff --git a/VerkkokauppaIO.java b/VerkkokauppaIO.java
index 7ece477..0327f80 100644
--- a/VerkkokauppaIO.java
+++ b/VerkkokauppaIO.java
@@ -1,6 +1,4 @@
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.PrintWriter;
+import java.io.*;
 import java.util.ArrayList;
 import java.util.Scanner;
 
@@ -13,10 +11,8 @@ import java.util.Scanner;
 public class VerkkokauppaIO {
 
     public static void main(String[] args) {
-        ArrayList<Asiakas> al = lueAsiakkaat("asiakkaat.csv");
-        for (Asiakas as : al) {
-            System.out.println(as);
-        }
+        // Tähän voi kirjoittaa koodia, jolla testata
+        // kirjoitus- ja lukumetodien toimintaa helposti
     }
 
     private static final String EROTIN = ";";
@@ -49,6 +45,12 @@ public class VerkkokauppaIO {
         return data;
     }
 
+    /**
+     * Kirjoittaa asiakaslistan annetun nimiseen tiedostoon.
+     *
+     * @param asiakasLista  lista kirjoitettavista asiakkaista.
+     * @param tiedostonNimi kirjoitettavan tiedoston nimi
+     */
     public static void kirjoitaAsiakkaat(ArrayList<Asiakas> asiakasLista,
                                          String tiedostonNimi) {
         String data = "";
@@ -98,4 +100,40 @@ public class VerkkokauppaIO {
         }
         return asiakkaat;
     }
+
+    /**
+     * Kirjoittaa tuotelistan annetun nimiseen tiedostoon.
+     *
+     * @param tuotelista    lista tuotteista
+     * @param tiedostonNimi kirjoitettavan tiedoston nimi
+     */
+    public static void kirjoitaTuotteet(ArrayList<Tuote> tuotelista, String tiedostonNimi) {
+        try (ObjectOutputStream oos =
+                     new ObjectOutputStream(
+                             new FileOutputStream(tiedostonNimi))) {
+            oos.writeObject(tuotelista);
+        } catch (IOException e) {
+            System.out.println("Tapahtui virhe: " + e);
+        }
+    }
+
+    /**
+     * Lukee tuotelistan tiedostosta
+     *
+     * @param tiedostonNimi tiedoston nimi
+     * @return listan tuotteita
+     */
+    public static ArrayList<Tuote> lueTuotteet(String tiedostonNimi) {
+        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(tiedostonNimi))) {
+            ArrayList<Tuote> tlista = (ArrayList<Tuote>) ois.readObject();
+            return tlista;
+        } catch (IOException e) {
+            System.out.println("Tapahtui virhe: " + e);
+        } catch (ClassNotFoundException e) {
+            // Tämä virhe tulee, jos luettu tieto ei ole yhteensopiva
+            // sen luokan kanssa, jonka tyyppiseksi se yritetään muuntaa
+            System.out.println("Tapahtui virhe: " + e);
+        }
+        return null;
+    }
 }
diff --git a/VirtuaalinenTuote.java b/VirtuaalinenTuote.java
index 8dc454a..b89ceaa 100644
--- a/VirtuaalinenTuote.java
+++ b/VirtuaalinenTuote.java
@@ -11,4 +11,9 @@ public class VirtuaalinenTuote extends Tuote {
         // tilaukseen
         return 1000;
     }
+
+    @Override
+    public String toString() {
+        return super.getNimi() + " (" + super.getHinta() + "), virtuaalinen tuote.";
+    }
 }
\ No newline at end of file
diff --git a/asiakkaat.csv b/asiakkaat.csv
deleted file mode 100644
index 84638ea..0000000
--- a/asiakkaat.csv
+++ /dev/null
@@ -1,3 +0,0 @@
-12345;Antti Asiakas;10.0
-54321;Anna Asiakas;55.5
-99999;Keijo Keksitty;1000.0
\ No newline at end of file
diff --git a/out/production/oop-demo4-esimerkit/Tuote.class b/out/production/oop-demo4-esimerkit/Tuote.class
index 0f4366e0003bf8569a02d4bcd3784b14a8d04529..569fc21e049c8b3e9f348603194fe4ce453e1302 100644
GIT binary patch
literal 1820
zcmX^0Z`VEs1_pZuKQ0C)24;2!79Ivx1~x_pfvm)`ME#t^ymWp4q^#8B5=I6#o6Nk-
z5<5l)W)00SP6iGJPId+^9tLg(9!3V%kkb5;R7M7tyv*E8Mg}1tg!bT)qRhN>Ymf#$
z9tM5}0Y(Pa;>4Vkd`1RFPmrh(4}&m+2qOb)MrK|~A|nH%ix2|?gBTBkID-TugLrOY
zcB*rJUUFhdcxFk4bADcNNn&0}F(ZS92Bs}8o|>3~Y>s*@4Gatn3?SQNco<|sw(<Bn
zdIx*@dU|;Jg*bvF<arnrK#qe+1Uve;__H%8F*1mNJ(HQQADmj0nV6GVm6(*1%E%y4
z4CaQV78Pga=Y@K@FfuTDF*5MNoEVmvQ<};OvX_B@fsv6x9E*EBT{OcO8Cab2Q&Jfj
z_<b_-QvFJElTwR9AXW(Z<R>TQge4Ybg7{EDmXeIjVnzmbA8?pkGcvHJr<VAE!(BuJ
zi}x8B*o$EbM6tL5<N}WL)RJIGq%dn}dNML_6vG8rG(15{c!Nt4le2vj3!u&bY4L!>
z7_)|^3q%W4fJFoBFOHIYNbEB*aM&d0K$8zwaDHh~a;jS<C=j{8p3nn@Fe8J2Q+|F)
zaY<2Pfp2O_Mt({$KO2K17lRXnGdqI|C_T6`GN^!*LK0?XURi#2sy@UDND^^NOfJbU
zs$^uCf$UMJLWrRriFqkGsl_Tj`T5zU1=g6!1xW-&V@PE|Di-C@Na`V3#Tq#hphh?+
z=HvutmZVy9Ft{@^h%zc@Fe;>$7Ud^u>L`G7gOvg!BLk0TUS4XEb53G$acVI;gBK%%
zDu#El`GTFnhmk=Jzfwj9Hi(xQ6d5=em>3ut6dBkUq!^SLR2Uc;R2di;m>AR;m_Yd%
z%;skh0Mo(@BH*ke3#Apn;+zbO46F<q42%q#3=9l849pCmlrEyRoq<tHdn*IGmdsWL
zUM<b741ycMrf7k(G+2!&0}F!~11Ezx10RC~gD`_6gEj*LgBAk|0|SEygARi(ILC;9
z-N6VJ1G$6=%mTTEnSqf(k3k=5Gl&MMV%6Hhz`g-)6&nLcPzG!?517pgHJXvZfWZ)|
z*^YsU0c0>6*vSZog33Y$1_cII21T$5Vh~kO6BroSppIi?Fk&!<nuY8T-Zf|rQ2`r+
z?hq3OQ>bQts6)7<XEShUNpEG~1v!S90TgO{49pA+3>pk944Mp_4BB9mAP(Y!JBSNZ
zt}-w(m@zOgFf%ZMBFCJ;0&2KEII<ZSKtUw99?fNXVDr#jX31a$)f~vc0=Az=oo_nG
zZR*e%MRuDJ0~>=e12=;S*er<Kc;IdWm+lC+aWgP7Si_^whJghfJ3^r7)7ruysI`TG
zcNc>w0|R<oT7V6QI8+E~I0u6b11P3JNl+6UM+^+SA`Ft78Kec(1vWFtfkKfH9Ey-A
v<zrxD5N2Rzumy*L9fLgs0|N&GBZC72BZC`*2Ll5G7Xu@MCxbVGFM}iiSSL#%

delta 640
zcmbQkH;t3))W2Q(7#JAr8H^`#_1LjF>a{d5FfcH1GH@_R@GwX+h%hqn_&RzAd-{5M
zc>0Anf+VDQ7-Sd(5E8+TJ}&-@4C0eNG73*_V7xy$i%E%#L6L!jfr){EfpxL~i?pO9
zg9zAI83q9c1_llWMg~>}Sq4T1xyddps@n1l3=ContPBhc0t_q+f()DtLJWKi!VJO;
zA`A))3=CQfEDQ_`A`FTQN|UFsD6=awsDSnEV-c$d>1AVJWME(r2dm`)vspoE85kHC
z8B`h6Kx!En80;9Bz%F9b(%#CzzL9}}fr$a6n+q%|&A`ea12#bn%x8m|z`(%9z|8<M
zm61W6K?7=*J_94fo_eh<47_XLW<gvc4>kv+hk*g%5={mzsBV9#OSq(GGjM20Z)M;G
zxrQ0+8a@VQ1_lOY1{MYt22KVwut^XXfx=V?6gv!D4EziN42%rg3=I4X%nXd242%pq
z47woGCqHBrQwRA9;u1};esq`UF@W4JH(8ENwi2WkVy7+x8-pGLH-kP{55!I$cqs6I
zV*_j_$VzSo4h91TkR@^q3=Ep!AY)+Q6=4wF%pfkPF0h$F3gjn7u%93y%*nvUz{kMI
JU<eK^BLJ-iGll>F

diff --git a/out/production/oop-demo4-esimerkit/VerkkokauppaIO.class b/out/production/oop-demo4-esimerkit/VerkkokauppaIO.class
index e98deee2fbc1fe5ead5f5bd6b4dcc83bc26bb4f3..568611e6fb8e0f0b6ee66469ca45c292c77054e1 100644
GIT binary patch
delta 2702
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
b4orRklb;yAFfcH1F)%WGW%$nUlR**yWt&WJ

delta 1481
zcmeyay+@Jj)W2Q(7#JAr8O~1RGU4M*EY3{K&Q44$(Mv8ao9L||z>`y&>If5LWYC<%
zCOWx*g>~{>ZoY|&mUFO!<r0fG`!gP8(%@i7VPs&m=3<a%NaJBhXYgcXU{6miaY-ym
z6k=dx$mC)0V8~)*u$cUgMQySHvyg@m0~3Qg7lR{1E)PQ<Lp~z|TTW_TdPxQ&1G9#v
zCrF}@hoOj}c=AdXO}0`VhBAio$v0RW*(!M$su-##%d?tr*D}<xGt~1iG%z$yj$^gv
zkY{M-VPIuwnY@ryU#^XZp`C$`k%2p>G&LkMH6_2eB%h0ci=mT;p^Kq=@;g@j$tmnJ
z_?Qxl85uZzpnjRm&7r`?l$gWFAUcUlWU@Dh%;f)^%9}elVi<XOzyXw4?2}nsk~mp`
zD{k^6F7L_Txy||Za53y<*vHPWALPjclWlm8FdmxB$ScNqgpq-Xk&%Pp*klD>F_x2z
z462hC@`z8a=iy^xXE@EsAP42LPj2QF3+rL%Wng6JV_;xlVn}9SXJBMtWng1qWawvL
zV9;k^WME`qU|`kS&cL`4tYiWM16Z1YftO(-0|NsOL;=GjhRF;J44e#87^Z?WPkzs9
zRS!}t#=y$Jz#zcD#vsTb#~{R@${@_3!5{+GtH8j_AjiPYFpXh412Y2ygC@fahM8dV
zl^JF+%w}L@m;<$ejR7Pwmw}OC9s>gd9|O~025xo+0d@wlUkow~oS<j|*~-Ac@R5NT
zY@_vVhRG}V!XiO#P-5U<U|^79;AD_y;A4<s5M_{JP-l>1&|;8b&}NWjuwsx0yGM(G
zg@Kbnj$uB-0tO}qZ3cdZg$#=rm>3ustQi(F^fG{eHNz5cfX$m6&Tq}$4sr`a|Kyqc
zO<><@F>rzX!NH)#Ai<!`AkUz~pv|DiV8o!s;KE?Q;Lf1O;K88J5YAu-w^4#YhhZth
zG6p6F4<s8Sp*C_b1Tri~2@8nG3TRm9GjRN6kYHyJm^@2BLvSTHj#e>nGOT7;!@$JQ
zKl!qNYQ4M_i;g6VQ1Uj0)Ljf23=F<HyBM+=7<`xizpk^5A!i-~zYa5q!IH9#p}<#L
zX9q(GD6&}?K!K;mz{$YCV8+1AV9p@JV8NipV98*}V8vj<V8dX|V9VgnV9(&g-~jgy
zD0tU0OlM$WU|{fNSjRA%K@${izF_|_GB7iEF)U~3WnhBGEkxN|1_p+ClNShz)I<ER
zo`DmTW1z9x%D~3J#=yX!tOfE#g^xC~k*_w3k)JlJ(GG?hOP1XX@{u~a5-i&pnl^xg
z0OWEpa6<55U}x}S;AZe=;AaS65N8MiyVL|Mrwn!q0|PsQ48sP7nGB2!+zhr73>(4j
z<7W_I*u>Dwz|0`dz{9YaVGB5Q@Iqpofq~%~0~6Rymb)1QBDXX6_-O55Xq{XjBv;>I
z#i}jIx{V<weEI)-+8_r(f)bS085m+2I2hs>cp2gu)EE*NbQuyEOc;_F%o&p54%3C^
z304L*20n(Z487pMv;>DB0|N(xA;UIsir{6?0jCW}Sc)+)LF5t{Kp6!hxq^WSoMi+V
znEo*cfwK%G*QhW+!g)IbGs6yWknLpH#lXNI!obY1n}LzxAecN1CXX^4XJBC9Vqj!A
L!ElP<41**9nhFh*

diff --git a/out/production/oop-demo4-esimerkit/VirtuaalinenTuote.class b/out/production/oop-demo4-esimerkit/VirtuaalinenTuote.class
index bb7fb6bb9c514e1797f819cf67bdfbc14e7e63e8..fdaf0fe6176f082bb20076b2a68bc5f6e2e83b49 100644
GIT binary patch
literal 1078
zcmX^0Z`VEs1_pZuV=e|J24;2!79Ivx1~x_p){xTtl2k?pHk-`6%o00B25}9ati-ZJ
z{hY+Sbp7CxqRhN>Yfl%=FpxeD9tKVZE=C6S^wbi+%-l>y1`!QSOywY@JUk4%41A0X
z9O<bg9+`P1iHr=)8k#Ob3=9kcJPd*iLW~UJxry1S&iQ%Ci6!BgB^l27dBr7(c_qb+
z4C+|i;DW^>b_Nkf2Enk*qLR|Y#GK5$)I6wf#IPC=#>l|poS%})$iVNDnV0HUnwykb
z6q1;flgh{-<ddJAm=l&*lnLTP1zAcmGK(1*gnclqux4an$peRg5T^eb8CWwQUS@QG
zgg|g&PD(yF1UwlTI7;#%;mXLs6`WsMl$`38337rMhAn!am|$cOaLUgwDK05WEbvV&
z$;eMB=4WG2<6=-}&|qiK1O=uRBZCS^DJ0S|^UCtGQ=xGO317Fw<dXcNN=Akm$N>XY
z2r<+nF)t-2wOGX`KR>&)z#7w6NFpd2Ln;eWu_%v5QtzLXm6}{)jU0neBb*a+a)L8U
zQmr`{bQl?=7!@=aHFXrqkYZG!1e8Ga7#Vmx^YT)QoO2S3i&Kl)8T1($R5ARF%`5B-
zhKvky_?0p;utEIIpvWN1z{CIo%nXbStPG+Ij0|E73=CcjtPCs+3=AAv+DsbT85lP*
zFfcGNh%+!SfKodH0}BH?11p0B0|SEs12ae+gCv6#$QT9=25ANv21c-$EQ1^a69XfI
zJc9z%Ts;OxupEmZ^NTfbGugmmJYe&9z-$(%d5jE-3|vsX77QRaGBEIIZD(ND+Rnhe
xi-DhkVFQ{ef=H(DK}}(1Py(w`W>5jUi;+Q<fssL*K^N>FMg~0w0|p}oNdUz60Nelo

delta 180
zcmdnSag3Sk)W2Q(7#JAr8N?@YSunFRa7?_pdGd5d6)^@y26hG}1`uFkU}Rur;ACKA
z;F@g5ELqLXz`(!-mSbUHXJBREVPIfTU|?ooVBlcjW#9v8Vc=lkXAodu1d9nW2r+=n
w5M~eonZdxopvS-nmSYiQezAsufq{tuWF{L}j0bEU517pYHII=&6s$@N0L+FCpa1{>

diff --git a/out/production/oop-demo4-esimerkit/tuotteet.dat b/out/production/oop-demo4-esimerkit/tuotteet.dat
new file mode 100644
index 0000000000000000000000000000000000000000..a76bcbf70382847194646743ae0312070cc67981
GIT binary patch
literal 267
zcmZ4UmVvdnh(S0ju`E%qv?Mb}&#|Z|vC=2AxTK=-lI+amiF2757(E$SiZiQHD+(AG
z7+A_#KxA<d18YcWen~0=1TZo&FuO3YW@P4-BziKi7ANMU<ohtN<Yne&mM{qUfXvs=
zNz6;v4=yRn%uBbfC~y!y0|I9m7#NI77+C#tQ}Ysw3mNJdm>i@*5@$d%awQC0js*p&
zImMZod6`gY_L(3si-Cb*S_uQYQ(|6XVqRu(5rbe@W>HCLVq#8aUTPlLakm!wPB<KX
j*_nxfp#oxbB*eM@|NsAA!ocm5n30v3onKT^l34)&fG1Z_

literal 0
HcmV?d00001

-- 
GitLab