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