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