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