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