| Kerho.java |
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