1   package kerho;
2   import java.io.*;
3   import fi.jyu.mit.ohj2.Mjonot;
4   /**
5    * Kerhon jäsen joka osaa mm. itse huolehtia tunnusNro:staan.
6    *
7    * @author Vesa Lappalainen
8    * @version 1.0, 22.02.2003
9    */
10  public class Jasen { // NOPMD
11    private int tunnusnro;
12    private String nimi             = "";
13    private String hetu             = "";
14    private String katuosoite       = "";
15    private String postinumero      = "";
16    private String postiosoite      = "";
17    private String kotipuhelin      = "";
18    private String tyopuhelin       = "";
19    private String autopuhelin      = "";
20    private int    liittymisvuosi   = 0;
21    private double jmaksu           = 0;
22    private double maksu            = 0;
23    private String lisatietoja      = "";
24    private static int seuraavaNro = 1;  
25  
26    
27    /**
28     * Palauttaa jäsenen kenttien lukumäärän
29     * @return kenttien lukumäärä
30     */
31    public int getKenttia() { return 13; }
32  
33    
34    /**
35     * Eka kenttä joka on mielekäs kysyttäväksi
36     * @return eknn kentän indeksi
37     */
38    public int ekaKentta()  { return 1;  }
39    
40    
41    /**
42     * Alustetaan jäsenen merkkijono-attribuuti tyhjiksi jonoiksi
43     * ja tunnusnro = 0.
44     */
45    public Jasen() {
46        // Toistaiseksi ei tarvita mitään
47    }
48    
49    /**
50     * Antaa k:n kentän sisällön merkkijonona
51     * @param k monenenko kentän sisältö palautetaan
52     * @return kentän sisältö merkkijonona
53     */
54    public String anna(int k) { // NOPMD
55      switch ( k ) {
56        case 0: return ""+tunnusnro     ;
57        case 1: return ""+nimi           ;
58        case 2: return ""+hetu           ;
59        case 3: return ""+katuosoite     ;
60        case 4: return ""+postinumero    ;
61        case 5: return ""+postiosoite    ;
62        case 6: return ""+kotipuhelin    ;
63        case 7: return ""+tyopuhelin     ;
64        case 8: return ""+autopuhelin    ;
65        case 9: return ""+liittymisvuosi ;
66        case 10: return ""+jmaksu         ;
67        case 11: return ""+maksu          ;
68        case 12: return ""+lisatietoja    ;
69        default:  return "Äääliö";
70      }
71    }
72  
73    
74    /**
75     * Asettaa k:n kentän arvoksi parametrina tuodun merkkijonon arvon
76     * @param k kuinka monennen kentän arvo asetetaan
77     * @param jono jonoa joka asetetaan kentän arvoksi
78     * @return null jos asettaminen onnistuu, muuten vastaava virheilmoitus.
79     */
80    public String aseta(int k,String jono) { // NOPMD
81      String tjono = jono.trim();  
82      StringBuffer sb = new StringBuffer(tjono);
83      switch ( k ) {
84        case 0:  tunnusnro      = Mjonot.erota(sb,'§',tunnusnro); return null;
85        case 1:  nimi           = tjono    ; return null;
86        case 2:  hetu           = tjono    ; return null;
87        case 3:  katuosoite     = tjono    ; return null;
88        case 4:  postinumero    = tjono    ; return null;
89        case 5:  postiosoite    = tjono    ; return null;
90        case 6:  kotipuhelin    = tjono    ; return null;
91        case 7:  tyopuhelin     = tjono    ; return null;
92        case 8:  autopuhelin    = tjono    ; return null;
93        case 9:
94          try {
95            liittymisvuosi = Mjonot.erotaEx(sb,'§',liittymisvuosi);
96          } catch (NumberFormatException ex) {
97            return "Liittymisvuosi väärin " + ex.getMessage();
98          }
99          return null;
100       case 10: jmaksu         = Mjonot.erota(sb,'§',jmaksu);         return null;
101       case 11: maksu          = Mjonot.erota(sb,'§',maksu);          return null;
102       case 12: lisatietoja    = Mjonot.erota(sb,'§',lisatietoja);    return null;
103       default:  return "ÄÄliö";
104     }
105   }  
106   
107   /**
108    * Palauttaa k:tta jäsenen kenttää vastaavan kysymyksen
109    * @param k kuinka monennen kentän kysymys palautetaan (0-alkuinen)
110    * @return k:netta kenttää vastaava kysymys
111    */
112   public String getKysymys(int k) { // NOPMD
113     switch ( k ) {
114       case 0: return "Tunnus nro"     ;
115       case 1: return "Jäsenen nimi"           ;
116       case 2: return "hetu"           ;
117       case 3: return "katuosoite"     ;
118       case 4: return "postinumero"    ;
119       case 5: return "postiosoite"    ;
120       case 6: return "kotipuhelin"    ;
121       case 7: return "tyopuhelin"     ;
122       case 8: return "autopuhelin"   ;
123       case 9: return "liittymisvuosi" ;
124       case 10: return "jmaksu"         ;
125       case 11: return "maksu"          ;
126       case 12: return "lisatietoja"    ;
127       default:  return "Äääliö";
128     }
129   }
130   
131   /**
132    * Arvotaan satunnainen kokonaisluku välille [ala,yla]
133    * @param ala arvonnan alaraja
134    * @param yla arvonnan yläraja
135    * @return satunnainen luku väliltä [ala,yla]
136    */
137   public static int rand(int ala, int yla) {
138     double n = (yla-ala)*Math.random() + ala;
139     return (int)Math.round(n);
140   }
141 
142   
143   /**
144    * Apumetodi, jolla saadaan täytettyä testiarvot jäsenelle.
145    * @param apuhetu hetu joka annetaan henkilölle 
146    */
147   public void vastaaAkuAnkka(String apuhetu) {
148     nimi           = "Ankka Aku";
149     hetu           = apuhetu;
150     katuosoite     = "Ankkakuja 6";
151     postinumero    = "12345";
152     postiosoite    = "ANKKALINNA";
153     kotipuhelin    = "12-1234";
154     tyopuhelin     = "";
155     autopuhelin    = "";
156     liittymisvuosi = 1996;
157     jmaksu         = 50.00;
158     maksu          = 30.00;
159     lisatietoja    = "Velkaa Roopelle";
160   }
161 
162   
163   /**
164    * Apumetodi, jolla saadaan täytettyä testiarvot jäsenelle.
165    * Henkilötunnus arvotaan, jotta kahdella jäsenellä ei olisi
166    * samoja tietoja.
167    */
168   public void vastaaAkuAnkka() {
169     String apuhetu = Mjonot.fmt(rand(1,31),2,'0') +
170                      Mjonot.fmt(rand(1,12),2,'0') +
171                      Mjonot.fmt(rand(1,99),2,'0') + "-" +
172                      Mjonot.fmt(rand(1,1000),3,'0') +
173                      ( (char)((int)'A'+rand(0,25)));
174     vastaaAkuAnkka(apuhetu);
175   }
176 
177   
178   /**
179    * Tulostetaan henkilön tiedot
180    * @param out tietovirta johon tulostetaan
181    */
182   public void tulosta(PrintStream out) {
183     out.println(Mjonot.fmt(tunnusnro,3,'0')+ "  " + nimi + "  " + hetu);
184     out.println("  " + katuosoite + "  " +  postinumero + " " + postiosoite);
185     out.println("  k: " + kotipuhelin +
186                 " t: " + tyopuhelin  +
187                 " a: " + autopuhelin);
188     out.print("  Liittynyt " + liittymisvuosi + ".");
189     out.println("  Jäsenmaksu " + Mjonot.fmt(jmaksu,4,2) + " mk." +
190                 "  Maksettu "   + Mjonot.fmt(maksu,4,2)  + " mk.");
191     out.println("  " + lisatietoja);
192   }
193 
194   
195   /**
196    * Tulostetaan henkilön tiedot
197    * @param os tietovirta johon tulostetaan
198    */
199   public void tulosta(OutputStream os) {
200     tulosta(new PrintStream(os));
201   }
202 
203   /**
204    * Antaa jäsenelle seuraavan rekisterinumeron.
205    * @return jäsenen uusi tunnusNro
206    * @example
207    * <pre name="test">
208    *   Jasen aku1 = new Jasen();
209    *   aku1.getTunnusnro() === 0;
210    *   aku1.rekisteroi();
211    *   Jasen aku2 = new Jasen();
212    *   aku2.rekisteroi();
213    *   int n1 = aku1.getTunnusnro();
214    *   int n2 = aku2.getTunnusnro();
215    *   n1 === n2-1;
216    * </pre>
217    */
218   public int  rekisteroi() {
219     tunnusnro = seuraavaNro;
220     seuraavaNro++;
221     return tunnusnro;
222   }
223 
224   
225   /**
226    * Palauttaa jäsenen tunnusnumeron.
227    * @return jäsenen tunnusnumero
228    */
229   public int getTunnusnro() { return tunnusnro; }
230 
231   
232   /**
233    * Palauttaa jäsenen tiedot merkkijonona jonka voi tallentaa tiedostoon.
234    * @return jäsen tolppaeroteltuna merkkijonona 
235    */
236   @Override
237   public String toString() {
238       StringBuffer sb = new StringBuffer("");
239       String erotin = "";
240       for (int k=0; k<getKenttia(); k++) {
241         sb.append(erotin);  sb.append(anna(k));
242         erotin = "|";
243       }  
244       return sb.toString();  
245   }
246 
247   
248   /**
249    * Selvitää jäsenen tiedot | erotellusta merkkijonosta
250    * Pitää huolen että seuraavaNro on suurempi kuin tuleva tunnusNro.
251    * @param rivi josta jäsenen tiedot otetaan
252    * 
253    * @example
254    * <pre name="test">
255    *   Jasen jasen = new Jasen();
256    *   jasen.parse("   3  |  Ankka Aku   | 123");
257    *   jasen.getTunnusnro() === 3;
258    *   jasen.toString().startsWith("3|Ankka Aku|123|") === true; // on enemmäkin kuin 3 kenttää, siksi loppu |
259    *
260    *   jasen.rekisteroi();
261    *   int n = jasen.getTunnusnro();
262    *   jasen.parse(""+(n+20));       // Otetaan merkkijonosta vain tunnusnumero
263    *   jasen.rekisteroi();           // ja tarkistetaan että seuraavalla kertaa tulee yhtä isompi
264    *   jasen.getTunnusnro() === n+20+1;
265    *     
266    * </pre>
267    */
268   public void parse(String rivi) {
269       StringBuffer sb = new StringBuffer(rivi);
270       for (int k = 0; k < getKenttia(); k++ )
271         aseta(k,Mjonot.erota(sb,'|'));
272       if ( tunnusnro >= seuraavaNro ) seuraavaNro = tunnusnro + 1;
273   }
274 
275   
276   
277   /**
278    * Testiohjelma jäsenelle.
279    * @param args ei käytössä
280    */
281   public static void main(String args[]) {
282     Jasen aku = new Jasen(), aku2 = new Jasen();
283     aku.rekisteroi();
284     aku2.rekisteroi();
285     aku.tulosta(System.out);
286     aku.vastaaAkuAnkka();
287     aku.tulosta(System.out);
288 
289     aku2.vastaaAkuAnkka();
290     aku2.tulosta(System.out);
291 
292     aku2.vastaaAkuAnkka();
293     aku2.tulosta(System.out);
294   }
295 
296 
297 }
298 
299 
300