1   package kerho;
2   
3   import java.util.Collection;
4   import java.util.Iterator;
5   
6   /**
7    * Kerho-luokka, joka huolehtii jäsenistöstä.  Pääosin kaikki metodit
8    * ovat vain "välittäjämetodeja" jäsenistöön.
9    *
10   * @author Vesa Lappalainen
11   * @version 1.0, 09.02.2003
12   * @version 1.1, 23.02.2003
13   * @version 1.2, 07.01.2008 / testit
14   */
15  public class Kerho implements Iterable<Jasen> {
16    private final Jasenet jasenet = new Jasenet();
17    private final Harrastukset harrastukset = new Harrastukset();
18  
19    
20    /**
21     * Palauttaa kerhon nimen
22     * @return kerhon nimi
23     */
24    public String getNimi() { return jasenet.getKokoNimi(); }
25  
26    
27    /**
28     * Palautaa kerhon jäsenmäärän
29     * @return jäsenmäärä
30     */
31    public int getJasenia() { return jasenet.getLkm();       }
32  
33    
34    /**
35     * Poistaa jäsenistöstä ja harrasteista ne joilla on nro. Kesken.
36     * @param nro viitenumero, jonka mukaan poistetaan
37     * @return montako jäsentä poistettiin
38     */
39    public int poista(int nro)             { return 0;                          }
40  
41    
42    /**
43     * Palauttaa tiedoston nimen 
44     * @return tiedoston nimi
45     */
46    public String getTiedostonNimi()       { return jasenet.getTiedostonNimi();}
47    
48    
49    /**
50     * Palauttaa varkopion nimen
51     * @return varakopion nimi
52     */
53    public String getBakNimi()             { return jasenet.getBakNimi();      }
54  
55    
56    /**
57     * Lisää kerhoon uuden jäsenen
58     * @param jasen lisättävä jäsen
59     * @throws SailoException jos lisääminen ei onnistu
60     * @example
61     * <pre name="test">
62     * #THROWS SailoException
63     * #PACKAGEIMPORT
64     * #import java.util.*;
65     * 
66     * Kerho kerho = new Kerho();
67     * Jasen aku1 = new Jasen(), aku2 = new Jasen();
68     * kerho.getJasenia() === 0;
69     * kerho.lisaa(aku1); kerho.getJasenia() === 1;
70     * kerho.lisaa(aku2); kerho.getJasenia() === 2;
71     * kerho.lisaa(aku1); kerho.getJasenia() === 3;
72     * 
73     * Iterator<Jasen>  i=kerho.iterator();
74     * i.next() == aku1  === true;
75     * i.next() == aku2  === true;
76     * i.next() == aku1  === true;
77     * i.next();  #THROWS NoSuchElementException
78     *
79     * kerho.lisaa(aku1); kerho.getJasenia() === 4;
80     * kerho.lisaa(aku1); kerho.getJasenia() === 5;
81     * kerho.lisaa(aku1);            #THROWS SailoException
82     * </pre>
83     * 
84     */
85    public void lisaa(Jasen jasen) throws SailoException { 
86      jasenet.lisaa(jasen);            
87    }
88    
89    
90    /**
91     * Korvaa jäsenen tietorakenteessa.  Ottaa jäsenen omistukseensa.
92     * Etsitään samalla tunnusnumerolla oleva jäsen.  Jos ei löydy,
93     * niin lisätään uutena jäsenenä.
94     * @param jasen lisätäävän jäsenen viite.  Huom tietorakenne muuttuu omistajaksi
95     * @throws SailoException jos tietorakennen on jo täynnä
96     */
97    public void korvaa(Jasen jasen) throws SailoException { 
98      jasenet.korvaa(jasen);             
99    }
100   
101   
102   /**
103    * Listään uusi harrastus kerhoon
104    * @param har lisättävä harrastus
105    */
106   public void lisaa(Harrastus har)  { 
107       harrastukset.lisaa(har);              
108   }
109   
110   
111   /**
112    * Kaikien jäsenten iteraattori
113    * @return jäseniteraattori
114    */
115   public Iterator<Jasen> iterator() { 
116       return jasenIterator();       
117   }
118 
119   
120   /**
121    * Kaikien jäsenten iteraattori
122    * @return jäseniteraattori
123    */
124   public Iterator<Jasen> jasenIterator() { 
125       return jasenet.iterator();       
126   }
127 
128   
129   /**
130    * Kaikkien harrastusten iteraattori
131    * @return harrastusiteraattori
132    */
133   public Iterator<Harrastus> harrastusIterator() { 
134       return harrastukset.iterator();  
135   }
136   
137   
138   /**
139    * Tietyn jäsenen iteraattori
140    * @param jid jäsenen viitenumero
141    * @return harrastusiteraattori yhdelle jäsenelle
142    */
143   public Iterator<Harrastus> harrastusIterator(int jid) { 
144       return harrastukset.iterator(jid);
145   }
146 
147   
148   /**
149    * Palauttaa i:n jäsenen
150    * @param i monesko jäsen palautetaan
151    * @return viite i:teen jäseneen
152    * @throws IndexOutOfBoundsException jos i väärin
153    * @deprecated ei ole hyvä käyttää, käytä iteraattoria mieluummin
154    */
155   @Deprecated
156   public Jasen annaJasen(int i) throws IndexOutOfBoundsException { 
157     return jasenet.anna(i);           
158   }
159 
160   /**
161    * Lukee kerhon tiedot tiedostosta
162    * @param nimi jota käyteään lukemisessa
163    * @throws SailoException jos lukeminen epäonnistuu
164    * 
165    * @example
166    * <pre name="test">
167    * #THROWS SailoException 
168    * #import java.io.File;
169    * 
170    *  Kerho kerho = new Kerho();
171    *  
172    *  Jasen aku1 = new Jasen(); aku1.vastaaAkuAnkka(); aku1.rekisteroi();
173    *  Jasen aku2 = new Jasen(); aku2.vastaaAkuAnkka(); aku2.rekisteroi();
174    *  Harrastus pitsi21 = new Harrastus(); pitsi21.vastaaPitsinNyplays(aku2.getTunnusnro());
175    *  Harrastus pitsi11 = new Harrastus(); pitsi11.vastaaPitsinNyplays(aku1.getTunnusnro());
176    *  Harrastus pitsi22 = new Harrastus(); pitsi22.vastaaPitsinNyplays(aku2.getTunnusnro()); 
177    *  Harrastus pitsi12 = new Harrastus(); pitsi12.vastaaPitsinNyplays(aku1.getTunnusnro()); 
178    *  Harrastus pitsi23 = new Harrastus(); pitsi23.vastaaPitsinNyplays(aku2.getTunnusnro());
179    *   
180    *  String tiedNimi = "testikelmit";
181    *  File ftied  = new File(tiedNimi+".dat");
182    *  File fhtied = new File(tiedNimi+".har");
183    *  ftied.delete();
184    *  fhtied.delete();
185    *  kerho.lueTiedostosta(tiedNimi); #THROWS SailoException
186    *  kerho.lisaa(aku1);
187    *  kerho.lisaa(aku2);
188    *  kerho.lisaa(pitsi21);
189    *  kerho.lisaa(pitsi11);
190    *  kerho.lisaa(pitsi22);
191    *  kerho.lisaa(pitsi12);
192    *  kerho.lisaa(pitsi23);
193    *  kerho.talleta();
194    *  kerho = new Kerho();
195    *  kerho.lueTiedostosta(tiedNimi);
196    *  Iterator<Jasen> i = kerho.iterator();
197    *  i.next().toString() === aku1.toString();
198    *  i.next().toString() === aku2.toString();
199    *  i.hasNext() === false;
200    *  Iterator<Harrastus> ih = kerho.harrastusIterator();
201    *  ih.next().toString() === pitsi21.toString();
202    *  ih.next().toString() === pitsi11.toString();
203    *  ih.next().toString() === pitsi22.toString();
204    *  ih.next().toString() === pitsi12.toString();
205    *  ih.next().toString() === pitsi23.toString();
206    *  ih.hasNext() === false;
207    *  kerho.lisaa(aku2);
208    *  kerho.lisaa(pitsi23);
209    *  kerho.talleta();
210    *  ftied.delete()  === true;
211    *  fhtied.delete() === true;
212    *  File fbak = new File(tiedNimi+".bak");
213    *  File fhbak = new File(tiedNimi+".hbak");
214    *  fbak.delete() === true;
215    *  fhbak.delete() === true;
216    * </pre>
217    */
218   public void lueTiedostosta(String nimi) throws SailoException {
219     jasenet.setTiedostonPerusNimi(nimi);  
220     harrastukset.setTiedostonPerusNimi(nimi);  
221     jasenet.lueTiedostosta(nimi);
222     harrastukset.lueTiedostosta(nimi);
223   }
224 
225   
226   /**
227    * Tallettaa kerhon tiedot tiedostoon.  
228    * Vaikka jäsenten tallettamien epäonistuisi, niin yritetään silti tallettaa
229    * harrastuksia ennen poikkeuksen heittämistä.
230    * @throws SailoException jos tallettamisessa ongelmia
231    */
232   public void talleta() throws SailoException {
233     String virhe = "";
234     try {
235       jasenet.talleta();
236     } catch ( SailoException ex ) {
237       virhe = ex.getMessage();
238     }
239 
240     try {
241       harrastukset.talleta();
242     } catch ( SailoException ex ) {
243       virhe += ex.getMessage();
244     }
245     if ( !"".equals(virhe) ) throw new SailoException(virhe);
246   }
247 
248   
249   /**
250    * Palauttaa "taulukossa" hakuehtoon vastaavien jäsenten viitteet
251    * @param hakuehto hakuehto 
252    * @param k etsittävän kentän indeksi 
253    * @return tietorakenteen löytyneistä jäsenistä
254    */
255   public Collection<Jasen> etsi(String hakuehto,int k) {
256     return jasenet.etsi(hakuehto,k);
257   }
258 
259 
260   /**
261    * Etsii jäsenen id:n perusteella
262    * @param id tunnusnumero, jonka mukaan etsitään
263    * @return jäsen jolla etsittävä id tai null
264    */
265   public Jasen annaJasenId(int id) {
266     return jasenet.annaId(id);
267   }
268 
269   
270   
271   /**
272    * Testiohjelma kerhosta
273    * @param args ei käytössä
274    */
275   public static void main(String args[]) {
276     Kerho kerho = new Kerho();
277 
278     try {
279       kerho.lueTiedostosta("kelmit");
280 
281       Jasen aku = new Jasen(), aku2 = new Jasen();
282       aku.rekisteroi();    aku.vastaaAkuAnkka();
283       aku2.rekisteroi();   aku2.vastaaAkuAnkka();
284 
285       kerho.lisaa(aku);
286       kerho.lisaa(aku2);
287 
288       System.out.println("============= Kerhon testi =================");
289 
290       for (int i=0; i<kerho.getJasenia(); i++) {
291         Jasen jasen = kerho.annaJasen(i);
292         System.out.println("Jäsen nro: " + i);
293         jasen.tulosta(System.out);
294       }
295 
296     } catch ( SailoException ex ) {
297       System.out.println(ex.getMessage());
298     }
299   }
300 
301 
302     /**
303      * Haetaan kaikki jäsen harrastukset
304      * @param jasen jäsen jolle harrastuksia haetaan
305      * @return tietorakenne jossa viiteet löydetteyihin harrastuksiin
306      */
307     public Collection<Harrastus> annaHarrastukset(Jasen jasen) {
308         return harrastukset.annaHarrastukset(jasen.getTunnusnro());
309     }
310 
311 
312 }
313 
314 
315