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