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