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 {
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     * Arvotaan satunnainen kokonaisluku välille [ala,yla]
29     * @param ala arvonnan alaraja
30     * @param yla arvonnan yläraja
31     * @return satunnainen luku väliltä [ala,yla]
32     */
33    public static int rand(int ala, int yla) {
34      double n = (yla-ala)*Math.random() + ala;
35      return (int)Math.round(n);
36    }
37  
38    
39    /**
40     * Apumetodi, jolla saadaan täytettyä testiarvot jäsenelle.
41     * @param apuhetu hetu joka annetaan henkilölle 
42     */
43    public void vastaaAkuAnkka(String apuhetu) {
44      nimi           = "Ankka Aku";
45      hetu           = apuhetu;
46      katuosoite     = "Ankkakuja 6";
47      postinumero    = "12345";
48      postiosoite    = "ANKKALINNA";
49      kotipuhelin    = "12-1234";
50      tyopuhelin     = "";
51      autopuhelin    = "";
52      liittymisvuosi = 1996;
53      jmaksu         = 50.00;
54      maksu          = 30.00;
55      lisatietoja    = "Velkaa Roopelle";
56    }
57  
58    
59    /**
60     * Apumetodi, jolla saadaan täytettyä testiarvot jäsenelle.
61     * Henkilötunnus arvotaan, jotta kahdella jäsenellä ei olisi
62     * samoja tietoja.
63     */
64    public void vastaaAkuAnkka() {
65      String apuhetu = Mjonot.fmt(rand(1,31),2,'0') +
66                       Mjonot.fmt(rand(1,12),2,'0') +
67                       Mjonot.fmt(rand(1,99),2,'0') + "-" +
68                       Mjonot.fmt(rand(1,1000),3,'0') +
69                       ( (char)((int)'A'+rand(0,25)));
70      vastaaAkuAnkka(apuhetu);
71    }
72  
73    
74    /**
75     * Tulostetaan henkilön tiedot
76     * @param out tietovirta johon tulostetaan
77     */
78    public void tulosta(PrintStream out) {
79      out.println(Mjonot.fmt(tunnusNro,3,'0')+ "  " + nimi + "  " + hetu);
80      out.println("  " + katuosoite + "  " +  postinumero + " " + postiosoite);
81      out.println("  k: " + kotipuhelin +
82                  " t: " + tyopuhelin  +
83                  " a: " + autopuhelin);
84      out.print("  Liittynyt " + liittymisvuosi + ".");
85      out.println("  Jäsenmaksu " + Mjonot.fmt(jmaksu,4,2) + " mk." +
86                  "  Maksettu "   + Mjonot.fmt(maksu,4,2)  + " mk.");
87      out.println("  " + lisatietoja);
88    }
89  
90    
91    /**
92     * Tulostetaan henkilön tiedot
93     * @param os tietovirta johon tulostetaan
94     */
95    public void tulosta(OutputStream os) {
96      tulosta(new PrintStream(os));
97    }
98  
99    /**
100    * Antaa jäsenelle seuraavan rekisterinumeron.
101    * @return jäsenen uusi tunnusNro
102    * @example
103    * <pre name="test">
104    *   Jasen aku1 = new Jasen();
105    *   aku1.getTunnusNro() === 0;
106    *   aku1.rekisteroi();
107    *   Jasen aku2 = new Jasen();
108    *   aku2.rekisteroi();
109    *   int n1 = aku1.getTunnusNro();
110    *   int n2 = aku2.getTunnusNro();
111    *   n1 === n2-1;
112    * </pre>
113    */
114   public int  rekisteroi() {
115     tunnusNro = seuraavaNro;
116     seuraavaNro++;
117     return tunnusNro;
118   }
119 
120   
121   /**
122    * Palauttaa jäsenen tunnusnumeron.
123    * @return jäsenen tunnusnumero
124    */
125   public int getTunnusNro() { return tunnusNro; }
126 
127   
128   /**
129    * Palauttaa jäsenen tiedot merkkijonona jonka voi tallentaa tiedostoon.
130    * @return jäsen tolppaeroteltuna merkkijonona 
131    */
132   @Override
133   public String toString() {
134     return        "" +
135       tunnusNro      + "|" +
136       nimi           + "|" +
137       hetu           + "|" +
138       katuosoite     + "|" +
139       postinumero    + "|" +
140       postiosoite    + "|" +
141       kotipuhelin    + "|" +
142       tyopuhelin     + "|" +
143       autopuhelin    + "|" +
144       liittymisvuosi + "|" +
145       jmaksu         + "|" +
146       maksu          + "|" +
147       lisatietoja    ;
148   }
149 
150   
151   /**
152    * Selvitää jäsenen tiedot | erotellusta merkkijonosta
153    * Pitää huolen että seuraavaNro on suurempi kuin tuleva tunnusNro.
154    * @param rivi josta jäsenen tiedot otetaan
155    * 
156    * @example
157    * <pre name="test">
158    *   Jasen jasen = new Jasen();
159    *   jasen.parse("   3  |  Ankka Aku   | 123");
160    *   jasen.getTunnusNro() === 3;
161    *   jasen.toString().startsWith("3|Ankka Aku|123|") === true;
162    *
163    *   jasen.rekisteroi();
164    *   int n = jasen.getTunnusNro();
165    *   jasen.parse(""+(n+20));
166    *   jasen.rekisteroi();
167    *   jasen.getTunnusNro() === n+20+1;
168    *     
169    * </pre>
170    */
171   public void parse(String rivi) {
172     StringBuffer sb = new StringBuffer(rivi);
173     tunnusNro     = Mjonot.erota(sb,'|',tunnusNro);
174     if ( tunnusNro >= seuraavaNro ) seuraavaNro = tunnusNro + 1;
175     nimi           = Mjonot.erota(sb,'|',nimi);
176     hetu           = Mjonot.erota(sb,'|',hetu);
177     katuosoite     = Mjonot.erota(sb,'|',katuosoite);
178     postinumero    = Mjonot.erota(sb,'|',postinumero);
179     postiosoite    = Mjonot.erota(sb,'|',postiosoite);
180     kotipuhelin    = Mjonot.erota(sb,'|',kotipuhelin);
181     tyopuhelin     = Mjonot.erota(sb,'|',tyopuhelin);
182     autopuhelin    = Mjonot.erota(sb,'|',autopuhelin);
183     liittymisvuosi = Mjonot.erota(sb,'|',liittymisvuosi);
184     jmaksu         = Mjonot.erota(sb,'|',jmaksu);
185     maksu          = Mjonot.erota(sb,'|',maksu);
186     lisatietoja    = Mjonot.erota(sb,'|',lisatietoja);
187   }
188 
189   
190   
191   /**
192    * Testiohjelma jäsenelle.
193    * @param args ei käytössä
194    */
195   public static void main(String args[]) {
196     Jasen aku = new Jasen(), aku2 = new Jasen();
197     aku.rekisteroi();
198     aku2.rekisteroi();
199     aku.tulosta(System.out);
200     aku.vastaaAkuAnkka();
201     aku.tulosta(System.out);
202 
203     aku2.vastaaAkuAnkka();
204     aku2.tulosta(System.out);
205 
206     aku2.vastaaAkuAnkka();
207     aku2.tulosta(System.out);
208   }
209 
210 }
211 
212 
213