1   import java.io.*;
2   import fi.jyu.mit.ohj2.*;
3   /**
4    * Kerhon jäsen joka osaa mm. itse huolehtia tunnus_nro:staan.
5    *
6    * Muutokset:  02.04.2003, kenttien indeksointi<br>
7    *
8    * @author Vesa Lappalainen
9    * @version 1.0, 22.02.2003
10   * @version 1.3, 02.04.2003
11   */
12  public class Jasen {
13    private Kentta kentat[] = {
14      new IntKentta("id"),                           // 0
15      new JonoKentta("nimi"),
16      new HetuKentta("hetu",new HetuTarkistus()),    // 2
17      new JonoKentta("katuosoite"),
18      new JonoKentta("postinumero"),                 // 4
19      new JonoKentta("postiosoite"),
20      new JonoKentta("kotipuhelin"),                 // 6
21      new JonoKentta("tyopuhelin"),
22      new JonoKentta("autopuhelin"),                 // 8
23      new IntKentta("liittymisvuosi"),               // 9
24      new RahaKentta("jäsenmaksu"),                  // A
25      new RahaKentta("maksettu maksu"),              // B
26      new JonoKentta("lisätietoja")                  // C
27    };
28  
29    private static int seuraava_nro = 1;
30  
31    public Jasen() {  }
32  
33    public int getKenttia() { return kentat.length; }
34    public int ekaKentta()  { return 1;  }
35  
36    /**
37     * Antaa k:n kentän sisällön merkkijonona
38     * @param k monenenko kentän sisältö palautetaan
39     * @return kentän sisältö merkkijonona
40     */
41    public String anna(int k) {
42      try {
43        return kentat[k].toString();
44      } catch (Exception ex) {
45        return "";
46      }
47    }
48  
49    /**
50     * Antaa k:n kentän sisällön avain-merkkijonona
51     * jonka perusteella vi lajitella
52     * @param k monenenko kentän sisältö palautetaan
53     * @return kentän sisältö merkkijonona
54     */
55    public String getAvain(int k) {
56      try {
57        return kentat[k].getAvain();
58      } catch (Exception ex) {
59        return "";
60      }
61    }
62  
63    /**
64     * Asettaa k:n kentän arvoksi parametrina tuodun merkkijonon arvon
65     * @param k kuinka monennen kentän arvo asetetaan
66     * @param jono jonoa joka asetetaan kentän arvoksi
67     * @return null jos asettaminen onnistuu, muuten vastaav virheilmoitus.
68     */
69    public String aseta(int k,String jono) {
70      try {
71        return kentat[k].aseta(jono);
72      } catch (Exception ex) {
73        return "Virhe: " + ex.getMessage();
74      }
75    }
76  
77    /**
78     * Palauttaa k:tta jäsenen kenttää vastaavan kysymyksen
79     * @param k kuinka monennen kentän kysymys palautetaan (0-alkuinen)
80     * @return k:netta kenttää vastaava kysymys
81     */
82    public String getKysymys(int k) {
83      try {
84        return kentat[k].getKysymys();
85      } catch (Exception ex) {
86        return "Ääliö";
87      }
88    }
89  
90    /**
91     * Arvotaan satunnainen kokonaisluku välille [ala,yla]
92     * @param ala arvonnan alaraja
93     * @param yla arvonnan yläraja
94     * @return satunnainen luku väliltä [ala,yla]
95     */
96    public static int rand(int ala, int yla) {
97      double n = (yla-ala)*Math.random() + ala;
98      return (int)Math.round(n);
99    }
100 
101   /**
102    * Apumetodi, jolla saadaan täytettyä testiarvot jäsenelle.
103    * Henkilötunnus arvotaan, jotta kahdella jäsenellä ei olisi
104    * samoja tietoja.
105    */
106   public void vastaa_aku_ankka() {
107 /*
108     String apuhetu = Mjonot.fmt(rand(1,31),2,'0') +
109                      Mjonot.fmt(rand(1,12),2,'0') +
110                      Mjonot.fmt(rand(1,99),2,'0') + "-" +
111                      Mjonot.fmt(rand(1,1000),3,'0') +
112                      ( (char)((int)'A'+rand(1,25)));
113 
114     nimi           = "Ankka Aku";
115     hetu           = apuhetu;
116     katuosoite     = "Ankkakuja 6";
117     postinumero    = "12345";
118     postiosoite    = "ANKKALINNA";
119     kotipuhelin    = "12-1234";
120     tyopuhelin     = "";
121     autopuhelin    = "";
122     liittymisvuosi = 1996;
123     jmaksu         = 50.00;
124     maksu          = 30.00;
125     lisatietoja    = "Velkaa Roopelle";
126 */
127   }
128 
129   /**
130    * Tulostetaan henkilön tiedot
131    * @param out tietovirta johon tulostetaan
132    */
133   public void tulosta(PrintStream out) {
134 //    out.println(toString());
135     int pisin = 0;
136     for (int k=0; k<getKenttia(); k++)
137       if ( kentat[k].getKysymys().length() > pisin )
138         pisin = kentat[k].getKysymys().length();
139 
140     for (int k=0; k<getKenttia(); k++)
141       out.println(Mjonot.fmt(kentat[k].getKysymys(),-pisin-1) +
142                   ": " + kentat[k].toString());
143 /*
144     out.println(Mjonot.fmt(tunnus_nro,3,'0')+ "  " + nimi + "  " + hetu);
145     out.println("  " + katuosoite + "  " +  postinumero + " " + postiosoite);
146     out.println("  k: " + kotipuhelin +
147                 " t: " + tyopuhelin  +
148                 " a: " + autopuhelin);
149     out.print("  Liittynyt " + liittymisvuosi + ".");
150     out.println("  Jäsenmaksu " + Mjonot.fmt(jmaksu,4,2) + " mk." +
151                 "  Maksettu "   + Mjonot.fmt(maksu,4,2)  + " mk.");
152     out.println("  " + lisatietoja);
153 */
154   }
155 
156   /**
157    * Tulostetaan henkilön tiedot
158    * @param os tietovirta johon tulostetaan
159    */
160   public void tulosta(OutputStream os) {
161     tulosta(new PrintStream(os));
162   }
163 
164   /**
165    * Antaa jäsenelle seuraavan rekisterinumeron.
166    * @return jäsenen uusi tunnus_nro
167    */
168   public int  rekisteroi() {
169     ((IntKentta)(kentat[0])).setValue(seuraava_nro);
170     seuraava_nro++;
171     return getTunnus_nro();
172   }
173 
174   public final int getTunnus_nro() { return ((IntKentta)(kentat[0])).getValue(); }
175 
176   /**
177    * Muuttaa jäsenen tiedot |-erottetuksi merkkijonoksi
178    * @return |-erotettu merkkijono
179    */
180   public String toString() {
181     StringBuffer sb = new StringBuffer("");
182 
183     for (int k=0; k<getKenttia(); k++)
184       sb.append(anna(k) + "|");
185     return sb.toString();
186   }
187 
188   /**
189    * Otetaan jäsenen tiedot merkkijonosta joka on muotoa:<pre>
190    * 1|Ankka Aku|130227-411J|Ankkakuja 6|12345|ANKKALINNA|12-1234|||1996|50.0|30.0|Velkaa Roopelle|
191    * </pre>
192    * @param rivi merkkijono josta tiedot otetaan.
193    */
194   public void parse(String rivi) {
195     StringBuffer sb = new StringBuffer(rivi);
196     for (int k = 0; k < getKenttia(); k++ )
197       aseta(k,Mjonot.erota(sb,'|'));
198     if ( getTunnus_nro() >= seuraava_nro ) seuraava_nro = getTunnus_nro() + 1;
199   }
200 
201   /**
202    * Testiohjelma jäsenelle.
203    * @param args ei käytössä
204    */
205   public static void main(String args[]) {
206     Jasen aku = new Jasen(), aku2 = new Jasen();
207     aku.rekisteroi();
208     aku2.rekisteroi();
209     aku.tulosta(System.out);
210     aku.vastaa_aku_ankka();
211     aku.tulosta(System.out);
212 
213     aku2.vastaa_aku_ankka();
214     aku2.tulosta(System.out);
215 
216     aku2.vastaa_aku_ankka();
217     aku2.tulosta(System.out);
218 
219     System.out.println(aku2.toString());
220   }
221 
222 }
223 
224 
225