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