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