1   package kerho;
2   
3   import java.io.*;
4   
5   import kanta.HetuKentta;
6   import kanta.HetuTarkistus;
7   import kanta.IntKentta;
8   import kanta.JonoKentta;
9   import kanta.Kentta;
10  import kanta.PerusTietue;
11  import kanta.PuhelinKentta;
12  import kanta.RahaKentta;
13  import kanta.RegExpTarkistaja;
14  import kanta.SisaltaaTarkistaja;
15  
16  import fi.jyu.mit.ohj2.Mjonot;
17  
18  import static kanta.HetuTarkistus.*;
19  
20  /**
21   * Kerhon jäsen joka osaa mm. itse huolehtia tunnusNro:staan.
22   *
23   * @author Vesa Lappalainen
24   * @version 1.0, 22.02.2003
25   * @version 2.0, 09.01.2011 - kentät indeksoituna
26   * @version 2.1, 23.03.2012 - peritty tietueesta
27   *
28   * @example
29   * <pre name="test_getAvain">
30   * // getAvain() 
31   *   Jasen aku = new Jasen();
32   *   aku.parse("   1  |  Ankka Aku   | 030201-111C");
33   *   aku.getAvain(0) === "         1";
34   *   aku.getAvain(1) === "ANKKA AKU";
35   *   aku.getAvain(2) === "010203-111C";
36   *   aku.getAvain(20) === "";
37   * </pre>
38   * 
39   * @example
40   * <pre name="test_aseta">
41   * // aseta(String)
42   *   Jasen jasen = new Jasen();
43   *   jasen.aseta(1,"Ankka Aku") === null;
44   *   jasen.aseta(2,"kissa") =R= ".*Hetu liian lyhyt"
45   *   jasen.aseta(2,"030201-1111") === "hetu: Tarkistusmerkin kuuluisi olla C"; 
46   *   jasen.aseta(2,"030201-111C") === null; 
47   *   jasen.aseta(9,"kissa") === "liittymisvuosi: Ei kokonaisluku (kissa)";
48   *   jasen.aseta(9,"1940") === null;
49   * </pre>
50   * 
51   * @example
52   * <pre name="test_getOtsikot">
53   * // getOtsikot()
54   * #import java.util.Arrays;
55   *   Jasen jasen = new Jasen();
56   *   Arrays.toString(jasen.getOtsikot()) =R= "\\[nimi, hetu, katuosoite.*";
57   * </pre>
58   * 
59   * @example
60   * <pre name="test_rekisteroi">
61   * // rekisteroi()
62   *   Jasen aku1 = new Jasen();
63   *   aku1.getTunnusNro() === 0;
64   *   aku1.rekisteroi();
65   *   Jasen aku2 = new Jasen();
66   *   aku2.rekisteroi();
67   *   int n1 = aku1.getTunnusNro();
68   *   int n2 = aku2.getTunnusNro();
69   *   n1 === n2-1;
70   * </pre>
71   * 
72   * @example
73   * <pre name="test_parse">
74   * // parse(String)
75   *   Jasen jasen = new Jasen();
76   *   jasen.parse("   3  |  Ankka Aku   | 030201-111C");
77   *   jasen.getTunnusNro() === 3;
78   *   jasen.toString().startsWith("3|Ankka Aku|030201-111C|") === true; // on enemmäkin kuin 3 kenttää, siksi loppu |
79   *
80   *   jasen.rekisteroi();
81   *   int n = jasen.getTunnusNro();
82   *   jasen.parse(""+(n+20));       // Otetaan merkkijonosta vain tunnusnumero
83   *   jasen.rekisteroi();           // ja tarkistetaan että seuraavalla kertaa tulee yhtä isompi
84   *   jasen.getTunnusNro() === n+20+1;
85   * </pre>
86   * 
87   * @example
88   * <pre name="test_equals">
89   * // equals(Jasen)
90   *   Jasen jasen1 = new Jasen();
91   *   jasen1.parse("   3  |  Ankka Aku   | 030201-111C");
92   *   Jasen jasen2 = new Jasen();
93   *   jasen2.parse("   3  |  Ankka Aku   | 030201-111C");
94   *   Jasen jasen3 = new Jasen();
95   *   jasen3.parse("   3  |  Ankka Aku   | 030201-115H");
96   *   
97   *   jasen1.equals(jasen2) === true;
98   *   jasen2.equals(jasen1) === true;
99   *   jasen1.equals(jasen3) === false;
100  *   jasen3.equals(jasen2) === false;
101  * </pre>
102  */
103 public class Jasen extends PerusTietue {
104     private Kentta     kentat[]    = { // valitettavasti ei voi olla final
105                                        // vaikka pitäisi, clone estää tämän :-(
106             new IntKentta("id"),
107             new JonoKentta("nimi"),
108             new HetuKentta("hetu", new HetuTarkistus()),
109             new JonoKentta("katuosoite"),
110             new JonoKentta("postinumero", new SisaltaaTarkistaja(SisaltaaTarkistaja.NUMEROT)),
111             new JonoKentta("postiosoite"),
112             new PuhelinKentta("kotipuhelin"),
113             new PuhelinKentta("työpuhelin"),
114             new JonoKentta("autopuhelin", new RegExpTarkistaja("[- 0-9]*")),
115             new IntKentta("liittymisvuosi"),
116             new RahaKentta("jäsenmaksu"),
117             new RahaKentta("maksettumaksu"),
118             new JonoKentta("lisätietoja")
119     };
120 
121     private static int seuraavaNro = 1;
122 
123 
124     @Override
125     public Kentta[] getKentat() {
126         return kentat;
127     }
128 
129 
130     @Override
131     protected void setKentat(Kentta[] uudetKentat) {
132         kentat = uudetKentat;
133     }
134 
135 
136     @Override
137     public int getSeuraavaNro() {
138         return seuraavaNro;
139     }
140 
141 
142     @Override
143     protected void setSeuraavaNro(int i) {
144         seuraavaNro = i;
145     }
146 
147 
148 
149     /**
150      * Eka kenttä joka on mielekäs kysyttäväksi
151      * @return eknn kentän indeksi
152      */
153     @Override
154     public int ekaKentta() {
155         return 1;
156     }
157 
158     
159     /**
160      * Alustetaan jäsenen merkkijono-attribuuti tyhjiksi jonoiksi
161      * ja tunnusnro = 0.
162      */
163     public Jasen() {
164         // Toistaiseksi ei tarvita mitään
165     }
166 
167 
168     /**
169      * @return jäsenen nimi
170      * @example
171      * <pre name="test">
172      *   Jasen aku = new Jasen();
173      *   aku.vastaaAkuAnkka();
174      *   aku.getNimi() =R= "Ankka Aku .*";
175      * </pre>
176      */
177     public String getNimi() {
178         return anna(1);
179     }
180 
181     
182     /**
183      * Apumetodi, jolla saadaan täytettyä testiarvot jäsenelle.
184      * @param apuhetu hetu joka annetaan henkilölle 
185      */
186     public void vastaaAkuAnkka(String apuhetu) {
187         aseta(1,"Ankka Aku " + kanta.HetuTarkistus.rand(1000, 9999));
188         aseta(2,apuhetu);                                            
189         aseta(3,"Ankkakuja 6");                                      
190         aseta(4,"12345");                                            
191         aseta(5,"ANKKALINNA");                                       
192         aseta(6,"12-1234");                                          
193         aseta(7,"");                                                 
194         aseta(8,"");                                                 
195         aseta(9,"1996");                                             
196         aseta(10,"50");                                              
197         aseta(11,"30");                                              
198         aseta(12,"Velkaa Roopelle");                                 
199     }
200     
201     
202     
203     /**
204      * Apumetodi, jolla saadaan täytettyä testiarvot jäsenelle.
205      * Henkilötunnus arvotaan, jotta kahdella jäsenellä ei olisi
206      * samoja tietoja.
207      */
208     public void vastaaAkuAnkka() {
209         String apuhetu = arvoHetu();
210         vastaaAkuAnkka(apuhetu);
211     }
212 
213 
214     /**
215      * Tulostetaan henkilön tiedot
216      * @param out tietovirta johon tulostetaan
217      */
218     @Override
219     public void tulosta(PrintWriter out) {
220         int pisin = 0;
221         for (Kentta kentta : kentat)
222             if (kentta.getKysymys().length() > pisin)
223                 pisin = kentta.getKysymys().length();
224 
225         for (Kentta kentta : kentat)
226             out.println(Mjonot.fmt(kentta.getKysymys(), -pisin - 1) +
227                     ": " + kentta.toString());
228     }
229 
230 
231     /**
232      * Tehdään identtinen klooni jäsenestä
233      * @return Object kloonattu jäsen
234      * @example
235      * <pre name="test">
236      * #THROWS CloneNotSupportedException 
237      *   Jasen jasen = new Jasen();
238      *   jasen.parse("   3  |  Ankka Aku   | 123");
239      *   Jasen kopio = jasen.clone();
240      *   kopio.toString() === jasen.toString();
241      *   jasen.parse("   4  |  Ankka Tupu   | 123");
242      *   kopio.toString().equals(jasen.toString()) === false;
243      *   kopio instanceof Jasen === true;
244      * </pre>
245      */
246     @Override
247     public Jasen clone() throws CloneNotSupportedException { 
248         return (Jasen)super.clone();
249     }
250 
251     
252     /**
253      * Testiohjelma jäsenelle.
254      * @param args ei käytössä
255      */
256     public static void main(String args[]) {
257         Jasen aku = new Jasen(), aku2 = new Jasen();
258         aku.rekisteroi();
259         aku2.rekisteroi();
260         aku.tulosta(System.out);
261         aku.vastaaAkuAnkka();
262         aku.tulosta(System.out);
263 
264         aku2.vastaaAkuAnkka();
265         aku2.tulosta(System.out);
266 
267         aku2.vastaaAkuAnkka();
268         aku2.tulosta(System.out);
269     }
270 
271 }
272