1   package kerho;
2   
3   import java.io.*;
4   
5   import fi.jyu.mit.ohj2.Mjonot;
6   
7   import static kanta.HetuTarkistus.*;
8   
9   /**
10   * Kerhon jäsen joka osaa mm. itse huolehtia tunnusNro:staan.
11   *
12   * @author Vesa Lappalainen
13   * @version 1.0, 22.02.2003
14   */
15  public class Jasen {
16      private int        tunnusNro;
17      private String     nimi           = "";
18      private String     hetu           = "";
19      private String     katuosoite     = "";
20      private String     postinumero    = "";
21      private String     postiosoite    = "";
22      private String     kotipuhelin    = "";
23      private String     tyopuhelin     = "";
24      private String     autopuhelin    = "";
25      private int        liittymisvuosi = 0;
26      private double     jmaksu         = 0;
27      private double     maksu          = 0;
28      private String     lisatietoja    = "";
29  
30      private static int seuraavaNro    = 1;
31  
32  
33      /**
34       * @return jäsenen nimi
35       * @example
36       * <pre name="test">
37       *   Jasen aku = new Jasen();
38       *   aku.vastaaAkuAnkka();
39       *   aku.getNimi() =R= "Ankka Aku .*";
40       * </pre>
41       */
42      public String getNimi() {
43          return nimi;
44      }
45  
46  
47      /**
48       * Apumetodi, jolla saadaan täytettyä testiarvot jäsenelle.
49       * @param apuhetu hetu joka annetaan henkilölle 
50       */
51      public void vastaaAkuAnkka(String apuhetu) {
52          nimi = "Ankka Aku " + rand(1000, 9999);
53          hetu = apuhetu;
54          katuosoite = "Ankkakuja 6";
55          postinumero = "12345";
56          postiosoite = "ANKKALINNA";
57          kotipuhelin = "12-1234";
58          tyopuhelin = "";
59          autopuhelin = "";
60          liittymisvuosi = 1996;
61          jmaksu = 50.00;
62          maksu = 30.00;
63          lisatietoja = "Velkaa Roopelle";
64      }
65  
66  
67      /**
68       * Apumetodi, jolla saadaan täytettyä testiarvot jäsenelle.
69       * Henkilötunnus arvotaan, jotta kahdella jäsenellä ei olisi
70       * samoja tietoja.
71       */
72      public void vastaaAkuAnkka() {
73          String apuhetu = arvoHetu();
74          vastaaAkuAnkka(apuhetu);
75      }
76  
77  
78      /**
79       * Tulostetaan henkilön tiedot
80       * @param out tietovirta johon tulostetaan
81       */
82      public void tulosta(PrintStream out) {
83          out.println(String.format("%03d", tunnusNro, 3) + "  " + nimi + "  "
84                  + hetu);
85          out.println("  " + katuosoite + "  " + postinumero + " " + postiosoite);
86          out.println("  k: " + kotipuhelin +
87                  " t: " + tyopuhelin +
88                  " a: " + autopuhelin);
89          out.print("  Liittynyt " + liittymisvuosi + ".");
90          out.println("  Jäsenmaksu " + String.format("%4.2f", jmaksu) + " e." +
91                  "  Maksettu " + String.format("%4.2f", maksu) + " e.");
92          out.println("  " + lisatietoja);
93      }
94  
95  
96      /**
97       * Tulostetaan henkilön tiedot
98       * @param os tietovirta johon tulostetaan
99       */
100     public void tulosta(OutputStream os) {
101         tulosta(new PrintStream(os));
102     }
103 
104 
105     /**
106      * Antaa jäsenelle seuraavan rekisterinumeron.
107      * @return jäsenen uusi tunnusNro
108      * @example
109      * <pre name="test">
110      *   Jasen aku1 = new Jasen();
111      *   aku1.getTunnusNro() === 0;
112      *   aku1.rekisteroi();
113      *   Jasen aku2 = new Jasen();
114      *   aku2.rekisteroi();
115      *   int n1 = aku1.getTunnusNro();
116      *   int n2 = aku2.getTunnusNro();
117      *   n1 === n2-1;
118      * </pre>
119      */
120     public int rekisteroi() {
121         tunnusNro = seuraavaNro;
122         seuraavaNro++;
123         return tunnusNro;
124     }
125 
126 
127     /**
128      * Palauttaa jäsenen tunnusnumeron.
129      * @return jäsenen tunnusnumero
130      */
131     public int getTunnusNro() {
132         return tunnusNro;
133     }
134 
135 
136     /**
137      * Asettaa tunnusnumeron ja samalla varmistaa että
138      * seuraava numero on aina suurempi kuin tähän mennessä suurin.
139      * @param nr asetettava tunnusnumero
140      */
141     private void setTunnusNro(int nr) {
142         tunnusNro = nr;
143         if (tunnusNro >= seuraavaNro) seuraavaNro = tunnusNro + 1;
144     }
145     
146 
147     /**
148      * Palauttaa jäsenen tiedot merkkijonona jonka voi tallentaa tiedostoon.
149      * @return jäsen tolppaeroteltuna merkkijonona 
150      * @example
151      * <pre name="test">
152      *   Jasen jasen = new Jasen();
153      *   jasen.parse("   3  |  Ankka Aku   | 030201-111C");
154      *   jasen.toString().startsWith("3|Ankka Aku|030201-111C|") === true; // on enemmäkin kuin 3 kenttää, siksi loppu |
155      * </pre>  
156      */
157     @Override
158     public String toString() {
159         return "" +
160                 getTunnusNro() + "|" +
161                 nimi + "|" +
162                 hetu + "|" +
163                 katuosoite + "|" +
164                 postinumero + "|" +
165                 postiosoite + "|" +
166                 kotipuhelin + "|" +
167                 tyopuhelin + "|" +
168                 autopuhelin + "|" +
169                 liittymisvuosi + "|" +
170                 jmaksu + "|" +
171                 maksu + "|" +
172                 lisatietoja;
173     }
174 
175 
176     /**
177      * Selvitää jäsenen tiedot | erotellusta merkkijonosta
178      * Pitää huolen että seuraavaNro on suurempi kuin tuleva tunnusNro.
179      * @param rivi josta jäsenen tiedot otetaan
180      * 
181      * @example
182      * <pre name="test">
183      *   Jasen jasen = new Jasen();
184      *   jasen.parse("   3  |  Ankka Aku   | 030201-111C");
185      *   jasen.getTunnusnro() === 3;
186      *   jasen.toString().startsWith("3|Ankka Aku|030201-111C|") === true; // on enemmäkin kuin 3 kenttää, siksi loppu |
187      *
188      *   jasen.rekisteroi();
189      *   int n = jasen.getTunnusnro();
190      *   jasen.parse(""+(n+20));       // Otetaan merkkijonosta vain tunnusnumero
191      *   jasen.rekisteroi();           // ja tarkistetaan että seuraavalla kertaa tulee yhtä isompi
192      *   jasen.getTunnusnro() === n+20+1;
193      *     
194      * </pre>
195      */
196     public void parse(String rivi) {
197         StringBuffer sb = new StringBuffer(rivi);
198         setTunnusNro(Mjonot.erota(sb, '|', getTunnusNro()));
199         nimi = Mjonot.erota(sb, '|', nimi);
200         hetu = Mjonot.erota(sb, '|', hetu);
201         katuosoite = Mjonot.erota(sb, '|', katuosoite);
202         postinumero = Mjonot.erota(sb, '|', postinumero);
203         postiosoite = Mjonot.erota(sb, '|', postiosoite);
204         kotipuhelin = Mjonot.erota(sb, '|', kotipuhelin);
205         tyopuhelin = Mjonot.erota(sb, '|', tyopuhelin);
206         autopuhelin = Mjonot.erota(sb, '|', autopuhelin);
207         liittymisvuosi = Mjonot.erota(sb, '|', liittymisvuosi);
208         jmaksu = Mjonot.erota(sb, '|', jmaksu);
209         maksu = Mjonot.erota(sb, '|', maksu);
210         lisatietoja = Mjonot.erota(sb, '|', lisatietoja);
211     }
212     
213     
214     /**
215      * Testiohjelma jäsenelle.
216      * @param args ei käytössä
217      */
218     public static void main(String args[]) {
219         Jasen aku = new Jasen(), aku2 = new Jasen();
220         aku.rekisteroi();
221         aku2.rekisteroi();
222         aku.tulosta(System.out);
223         aku.vastaaAkuAnkka();
224         aku.tulosta(System.out);
225 
226         aku2.vastaaAkuAnkka();
227         aku2.tulosta(System.out);
228 
229         aku2.vastaaAkuAnkka();
230         aku2.tulosta(System.out);
231     }
232 
233 }
234