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