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