1   package kerho;
2   
3   import java.io.*;
4   
5   import fi.jyu.mit.ohj2.Mjonot;
6   import static kanta.HetuTarkistus.rand;
7   
8   /**
9    * Harrastus joka osaa mm. itse huolehtia tunnus_nro:staan.
10   *
11   * @author Vesa Lappalainen
12   * @version 1.0, 22.02.2003
13   */
14  public class Harrastus implements Cloneable {
15      private int tunnusNro;
16      private int jasenNro;
17      private String ala;
18      private int aloitusvuosi;
19      private int tuntiaViikossa;
20  
21      private static int seuraavaNro = 1;
22  
23  
24      /**
25       * Alustetaan harrastus.  Toistaiseksi ei tarvitse tehdä mitään
26       */
27      public Harrastus() {
28          // Vielä ei tarvita mitään
29      }
30  
31  
32      /**
33       * Alustetaan tietyn jäsenen harrastus.  
34       * @param jasenNro jäsenen viitenumero 
35       */
36      public Harrastus(int jasenNro) {
37          this.jasenNro = jasenNro;
38      }
39  
40      
41      /**
42       * @return harrastukse kenttien lukumäärä
43       */
44      public int getKenttia() {
45          return 5;
46      }
47  
48  
49      /**
50       * @return ensimmäinen käyttäjän syötettävän kentän indeksi
51       */
52      public int ekaKentta() {
53          return 2;
54      }
55  
56      /**
57       * @param k minkä kentän kysymys halutaan
58       * @return valitun kentän kysymysteksti
59       */
60      public String getKysymys(int k) {
61          switch (k) {
62              case 0:
63                  return "id";
64              case 1:
65                  return "jäsenId";
66              case 2:
67                  return "ala";
68              case 3:
69                  return "aloitusvuosi";
70              case 4:
71                  return "h/vko";
72              default:
73                  return "???";
74          }
75      }
76  
77  
78      /**
79       * @param k Minkä kentän sisältö halutaan
80       * @return valitun kentän sisältö
81       * @example
82       * <pre name="test">
83       *   Harrastus har = new Harrastus();
84       *   har.parse("   2   |  10  |   Kalastus  | 1949 | 22 t ");
85       *   har.anna(0) === "2";   
86       *   har.anna(1) === "10";   
87       *   har.anna(2) === "Kalastus";   
88       *   har.anna(3) === "1949";   
89       *   har.anna(4) === "22";   
90       *   
91       * </pre>
92       */
93      public String anna(int k) {
94          switch (k) {
95              case 0:
96                  return "" + tunnusNro;
97              case 1:
98                  return "" + jasenNro;
99              case 2:
100                 return ala;
101             case 3:
102                 return "" + aloitusvuosi;
103             case 4:
104                 return "" + tuntiaViikossa;
105             default:
106                 return "???";
107         }
108     }
109 
110 
111     /**
112      * Asetetaan valitun kentän sisältö.  Mikäli asettaminen onnistuu,
113      * palautetaan null, muutoin virheteksti.
114      * @param k minkä kentän sisältö asetetaan
115      * @param s asetettava sisältö merkkijonona
116      * @return null jos ok, muuten virheteksti
117      * @example
118      * <pre name="test">
119      *   Harrastus har = new Harrastus();
120      *   har.aseta(3,"kissa") === "Aloitusvuosi väärin jono = \"kissa\"";
121      *   har.aseta(3,"1940")  === null;
122      *   har.aseta(4,"kissa") === "Viikkotunnit väärin jono = \"kissa\"";
123      *   har.aseta(4,"20")    === null;
124      *   
125      * </pre>
126      */
127     public String aseta(int k, String s) {
128         String st = s.trim();
129         StringBuffer sb = new StringBuffer(st);
130         switch (k) {
131             case 0:
132                 setTunnusNro(Mjonot.erota(sb, '$', getTunnusNro()));
133                 return null;
134             case 1:
135                 jasenNro = Mjonot.erota(sb, '$', jasenNro);
136                 return null;
137             case 2:
138                 ala = st;
139                 return null;
140             case 3:
141                 try {
142                     aloitusvuosi = Mjonot.erotaEx(sb, '§', aloitusvuosi);
143                 } catch (NumberFormatException ex) {
144                     return "Aloitusvuosi väärin " + ex.getMessage();
145                 }
146                 return null;
147 
148             case 4:
149                 try {
150                     tuntiaViikossa = Mjonot.erotaEx(sb, '§', tuntiaViikossa);
151                 } catch (NumberFormatException ex) {
152                     return "Viikkotunnit väärin " + ex.getMessage();
153                 }
154                 return null;
155 
156             default:
157                 return "Väärä kentän indeksi";
158         }
159     }
160 
161 
162     /**
163      * Tehdään identtinen klooni jäsenestä
164      * @return Object kloonattu jäsen
165      * @example
166      * <pre name="test">
167      * #THROWS CloneNotSupportedException 
168      *   Harrastus har = new Harrastus();
169      *   har.parse("   2   |  10  |   Kalastus  | 1949 | 22 t ");
170      *   Harrastus kopio = har.clone();
171      *   kopio.toString() === har.toString();
172      *   har.parse("   1   |  11  |   Uinti  | 1949 | 22 t ");
173      *   kopio.toString().equals(har.toString()) === false;
174      * </pre>
175      */
176     @Override
177     public Harrastus clone() throws CloneNotSupportedException { // NOPMD
178         return (Harrastus)super.clone();
179     }
180     
181 
182     /**
183      * Apumetodi, jolla saadaan täytettyä testiarvot Harrastukselle.
184      * Aloitusvuosi arvotaan, jotta kahdella harrastuksella ei olisi
185      * samoja tietoja.
186      * @param nro viite henkilöön, jonka harrastuksesta on kyse
187      */
188     public void vastaaPitsinNyplays(int nro) {
189         jasenNro = nro;
190         ala = "Pitsin nypläys";
191         aloitusvuosi = rand(1900, 2000);
192         tuntiaViikossa = rand(0, 60);
193     }
194 
195 
196     /**
197      * Tulostetaan harrastuksen tiedot
198      * @param out tietovirta johon tulostetaan
199      */
200     public void tulosta(PrintStream out) {
201         out.println(ala + " " + aloitusvuosi + " " + tuntiaViikossa);
202     }
203 
204 
205     /**
206      * Tulostetaan henkilön tiedot
207      * @param os tietovirta johon tulostetaan
208      */
209     public void tulosta(OutputStream os) {
210         tulosta(new PrintStream(os));
211     }
212 
213 
214     /**
215      * Antaa harrastukselle seuraavan rekisterinumeron.
216      * @return harrastuksen uusi tunnus_nro
217      * @example
218      * <pre name="test">
219      *   Harrastus pitsi1 = new Harrastus();
220      *   pitsi1.getTunnusNro() === 0;
221      *   pitsi1.rekisteroi();
222      *   Harrastus pitsi2 = new Harrastus();
223      *   pitsi2.rekisteroi();
224      *   int n1 = pitsi1.getTunnusNro();
225      *   int n2 = pitsi2.getTunnusNro();
226      *   n1 === n2-1;
227      * </pre>
228      */
229     public int rekisteroi() {
230         tunnusNro = seuraavaNro;
231         seuraavaNro++;
232         return tunnusNro;
233     }
234 
235 
236     /**
237      * Palautetaan harrastuksen oma id
238      * @return harrastuksen id
239      */
240     public int getTunnusNro() {
241         return tunnusNro;
242     }
243 
244 
245     /**
246      * Asettaa tunnusnumeron ja samalla varmistaa että
247      * seuraava numero on aina suurempi kuin tähän mennessä suurin.
248      * @param nr asetettava tunnusnumero
249      */
250     private void setTunnusNro(int nr) {
251         tunnusNro = nr;
252         if (tunnusNro >= seuraavaNro) seuraavaNro = tunnusNro + 1;
253     }
254     
255 
256     /**
257      * Palautetaan mille jäsenelle harrastus kuuluu
258      * @return jäsenen id
259      */
260     public int getJasenNro() {
261         return jasenNro;
262     }
263 
264     
265     /**
266      * Palauttaa harrastuksen tiedot merkkijonona jonka voi tallentaa tiedostoon.
267      * @return harrastus tolppaeroteltuna merkkijonona 
268      * @example
269      * <pre name="test">
270      *   Harrastus harrastus = new Harrastus();
271      *   harrastus.parse("   2   |  10  |   Kalastus  | 1949 | 22 t ");
272      *   harrastus.toString()    === "2|10|Kalastus|1949|22";
273      * </pre>
274      */
275     @Override
276     public String toString() {
277         StringBuffer sb = new StringBuffer("");
278         String erotin = "";
279         for (int k = 0; k < getKenttia(); k++) {
280             sb.append(erotin);
281             sb.append(anna(k));
282             erotin = "|";
283         }
284         return sb.toString();
285      }
286 
287 
288     /**
289      * Selvitää harrastuksen tiedot | erotellusta merkkijonosta.
290      * Pitää huolen että seuraavaNro on suurempi kuin tuleva tunnusnro.
291      * @param rivi josta harrastuksen tiedot otetaan
292      * @example
293      * <pre name="test">
294      *   Harrastus harrastus = new Harrastus();
295      *   harrastus.parse("   2   |  10  |   Kalastus  | 1949 | 22 t ");
296      *   harrastus.getJasenNro() === 10;
297      *   harrastus.toString()    === "2|10|Kalastus|1949|22";
298      *   
299      *   harrastus.rekisteroi();
300      *   int n = harrastus.getTunnusNro();
301      *   harrastus.parse(""+(n+20));
302      *   harrastus.rekisteroi();
303      *   harrastus.getTunnusNro() === n+20+1;
304      *   harrastus.toString()     === "" + (n+20+1) + "|10||1949|22";
305      * </pre>
306      */
307     public void parse(String rivi) {
308         StringBuffer sb = new StringBuffer(rivi);
309         for (int k = 0; k < getKenttia(); k++)
310             aseta(k, Mjonot.erota(sb, '|'));
311     }
312 
313 
314     /**
315      * Testiohjelma Harrastukselle.
316      * @param args ei käytössä
317      */
318     public static void main(String[] args) {
319         Harrastus har = new Harrastus();
320         har.vastaaPitsinNyplays(2);
321         har.tulosta(System.out);
322     }
323 
324 }
325