| Harrastukset.java |
1 package kerho;
2
3 import java.io.BufferedReader;
4 import java.io.File;
5 import java.io.IOException;
6 import java.io.PrintWriter;
7 import java.util.*;
8
9 import fi.jyu.mit.ohj2.Tiedosto;
10
11 /**
12 * Kerhon harrastukset, joka osaa mm. lisätä uuden harrastuksen
13 *
14 * @author Vesa Lappalainen
15 * @version 1.0, 22.02.2003
16 */
17 public class Harrastukset implements Iterable<Harrastus> {
18 private boolean muutettu = false;
19 private String tiedostonPerusNimi = "";
20
21 /** Taulukko harrastuksista */
22 private final Collection<Harrastus> alkiot = new ArrayList<Harrastus>();
23
24
25 /**
26 * Harrastusten alustaminen
27 */
28 public Harrastukset() {
29 // toistaiseksi ei tarvitse tehdä mitään
30 }
31
32
33 /**
34 * Lisää uuden harrastuksen tietorakenteeseen. Ottaa harrastuksen omistukseensa.
35 * @param har lisättävä harrastus. Huom tietorakenne muuttuu omistajaksi
36 */
37 public void lisaa(Harrastus har) {
38 alkiot.add(har);
39 muutettu = true;
40 }
41
42
43 /**
44 * Poistaa valitun harrastuksen
45 * @param harrastus poistettava harrastus
46 * @return tosi jos löytyi poistettava harrastus
47 * <pre name="test">
48 * #THROWS SailoException
49 * #import java.io.File;
50 * Harrastukset harrasteet = new Harrastukset();
51 * Harrastus pitsi21 = new Harrastus(); pitsi21.vastaaPitsinNyplays(2);
52 * Harrastus pitsi11 = new Harrastus(); pitsi11.vastaaPitsinNyplays(1);
53 * Harrastus pitsi22 = new Harrastus(); pitsi22.vastaaPitsinNyplays(2);
54 * Harrastus pitsi12 = new Harrastus(); pitsi12.vastaaPitsinNyplays(1);
55 * Harrastus pitsi23 = new Harrastus(); pitsi23.vastaaPitsinNyplays(2);
56 * harrasteet.lisaa(pitsi21);
57 * harrasteet.lisaa(pitsi11);
58 * harrasteet.lisaa(pitsi22);
59 * harrasteet.lisaa(pitsi12);
60 * harrasteet.poista(pitsi23) === false ; harrasteet.getLkm() === 4;
61 * harrasteet.poista(pitsi11) === true; harrasteet.getLkm() === 3;
62 * List<Harrastus> h = harrasteet.annaHarrastukset(1);
63 * h.size() === 1;
64 * h = harrasteet.annaHarrastukset(1);
65 * h.get(0) === pitsi12;
66 * </pre>
67 */
68 public boolean poista(Harrastus harrastus) {
69 boolean ret = alkiot.remove(harrastus);
70 if (ret) muutettu = true;
71 return ret;
72 }
73
74
75 /**
76 * Poistaa kaikki tietyn jäsenen harrastukset
77 * @param jasenNro viite siihen, minkä jäsenen harrastukset poistetaan
78 * @return montako poistettiin
79 * @example
80 * <pre name="test">
81 * #THROWS SailoException
82 * #import java.io.File;
83 * Harrastukset harrasteet = new Harrastukset();
84 * Harrastus pitsi21 = new Harrastus(); pitsi21.vastaaPitsinNyplays(2);
85 * Harrastus pitsi11 = new Harrastus(); pitsi11.vastaaPitsinNyplays(1);
86 * Harrastus pitsi22 = new Harrastus(); pitsi22.vastaaPitsinNyplays(2);
87 * Harrastus pitsi12 = new Harrastus(); pitsi12.vastaaPitsinNyplays(1);
88 * Harrastus pitsi23 = new Harrastus(); pitsi23.vastaaPitsinNyplays(2);
89 * harrasteet.lisaa(pitsi21);
90 * harrasteet.lisaa(pitsi11);
91 * harrasteet.lisaa(pitsi22);
92 * harrasteet.lisaa(pitsi12);
93 * harrasteet.lisaa(pitsi23);
94 * harrasteet.poista(2) === 3; harrasteet.getLkm() === 2;
95 * harrasteet.poista(3) === 0; harrasteet.getLkm() === 2;
96 * List<Harrastus> h = harrasteet.annaHarrastukset(2);
97 * h.size() === 0;
98 * h = harrasteet.annaHarrastukset(1);
99 * h.get(0) === pitsi11;
100 * h.get(1) === pitsi12;
101 * </pre>
102 */
103 public int poista(int jasenNro) {
104 int n = 0;
105 for (Iterator<Harrastus> it = alkiot.iterator(); it.hasNext();) {
106 Harrastus har = it.next();
107 if (har.getJasenNro() == jasenNro) {
108 it.remove();
109 n++;
110 }
111 }
112 if (n > 0) muutettu = true;
113 return n;
114 }
115
116
117 /**
118 * Lukee harrastukset tiedostosta.
119 * @param tied tiedoston nimen alkuosa
120 * @throws SailoException jos lukeminen epäonnistuu
121 *
122 * @example
123 * <pre name="test">
124 * #THROWS SailoException
125 * #import java.io.File;
126 * Harrastukset harrasteet = new Harrastukset();
127 * Harrastus pitsi21 = new Harrastus(); pitsi21.vastaaPitsinNyplays(2);
128 * Harrastus pitsi11 = new Harrastus(); pitsi11.vastaaPitsinNyplays(1);
129 * Harrastus pitsi22 = new Harrastus(); pitsi22.vastaaPitsinNyplays(2);
130 * Harrastus pitsi12 = new Harrastus(); pitsi12.vastaaPitsinNyplays(1);
131 * Harrastus pitsi23 = new Harrastus(); pitsi23.vastaaPitsinNyplays(2);
132 * String tiedNimi = "testikelmit";
133 * File ftied = new File(tiedNimi+".har");
134 * ftied.delete();
135 * harrasteet.lueTiedostosta(tiedNimi); #THROWS SailoException
136 * harrasteet.lisaa(pitsi21);
137 * harrasteet.lisaa(pitsi11);
138 * harrasteet.lisaa(pitsi22);
139 * harrasteet.lisaa(pitsi12);
140 * harrasteet.lisaa(pitsi23);
141 * harrasteet.talleta();
142 * harrasteet = new Harrastukset();
143 * harrasteet.lueTiedostosta(tiedNimi);
144 * Iterator<Harrastus> i = harrasteet.iterator();
145 * i.next().toString() === pitsi21.toString();
146 * i.next().toString() === pitsi11.toString();
147 * i.next().toString() === pitsi22.toString();
148 * i.next().toString() === pitsi12.toString();
149 * i.next().toString() === pitsi23.toString();
150 * i.hasNext() === false;
151 * harrasteet.lisaa(pitsi23);
152 * harrasteet.talleta();
153 * ftied.delete() === true;
154 * File fbak = new File(tiedNimi+".hbak");
155 * fbak.delete() === true;
156 * </pre>
157 */
158 public void lueTiedostosta(String tied) throws SailoException {
159 muutettu = true;
160 setTiedostonPerusNimi(tied);
161 BufferedReader fi = Tiedosto.avaa_lukemista_varten(getTiedostonNimi());
162 if (fi == null) throw new SailoException("Tiedosto " + getTiedostonNimi() + " ei aukea");
163
164 String rivi;
165 try {
166 while ((rivi = fi.readLine()) != null) {
167 rivi = rivi.trim();
168 if ("".equals(rivi) || rivi.charAt(0) == ';') continue;
169 Harrastus har = new Harrastus();
170 har.parse(rivi); // voisi olla virhekäsittely
171 lisaa(har);
172 }
173 muutettu = false;
174
175 } catch (IOException e) {
176 throw new SailoException("Ongelmia tiedoston kanssa: " + e.getMessage());
177 } finally {
178 try {
179 fi.close();
180 } catch (IOException e) {
181 throw new SailoException("Tiedoston sulkeminen ei onnistu: " + e.getMessage());
182 }
183 }
184 }
185
186
187 /**
188 * Tallentaa harrastukset tiedostoon.
189 * @throws SailoException jos talletus epäonnistuu
190 */
191 public void talleta() throws SailoException {
192 if (!muutettu) return;
193
194 File fbak = new File(getBakNimi());
195 File ftied = new File(getTiedostonNimi());
196 fbak.delete(); // if ... System.err.println("Ei voi tuhota");
197 ftied.renameTo(fbak); // if ... System.err.println("Ei voi nimetä");
198
199 PrintWriter fo = Tiedosto.avaa_kirjoittamista_varten(ftied.getName());
200 if (fo == null) throw new SailoException("Tiedosto " + ftied.getName() + " ei aukea");
201 try {
202 for (Harrastus har : this) {
203 fo.println(har.toString());
204 }
205 } finally {
206 fo.close();
207 }
208
209 muutettu = false;
210 }
211
212
213 /**
214 * Palauttaa kerhon harrastusten lukumäärän
215 * @return harrastusten lukumäärä
216 */
217 public int getLkm() {
218 return alkiot.size();
219 }
220
221
222 /**
223 * Asettaa tiedoston perusnimen ilan tarkenninta
224 * @param tied tallennustiedoston perusnimi
225 */
226 public void setTiedostonPerusNimi(String tied) {
227 tiedostonPerusNimi = tied;
228 }
229
230
231 /**
232 * Palauttaa tiedoston nimen, jota käytetään tallennukseen
233 * @return tallennustiedoston nimi
234 */
235 public String getTiedostonPerusNimi() {
236 return tiedostonPerusNimi;
237 }
238
239
240 /**
241 * Palauttaa tiedoston nimen, jota käytetään tallennukseen
242 * @return tallennustiedoston nimi
243 */
244 public String getTiedostonNimi() {
245 return tiedostonPerusNimi + ".har";
246 }
247
248
249 /**
250 * Palauttaa varakopiotiedoston nimen
251 * @return varakopiotiedoston nimi
252 */
253 public String getBakNimi() {
254 return tiedostonPerusNimi + ".hbak";
255 }
256
257
258 /**
259 * Iteraattori kaikkien harrastusten läpikäymiseen
260 * @return harrastusiteraattori
261 *
262 * @example
263 * <pre name="test">
264 * #PACKAGEIMPORT
265 * #import java.util.*;
266 *
267 * Harrastukset harrasteet = new Harrastukset();
268 * Harrastus pitsi21 = new Harrastus(2); harrasteet.lisaa(pitsi21);
269 * Harrastus pitsi11 = new Harrastus(1); harrasteet.lisaa(pitsi11);
270 * Harrastus pitsi22 = new Harrastus(2); harrasteet.lisaa(pitsi22);
271 * Harrastus pitsi12 = new Harrastus(1); harrasteet.lisaa(pitsi12);
272 * Harrastus pitsi23 = new Harrastus(2); harrasteet.lisaa(pitsi23);
273 *
274 * Iterator<Harrastus> i2=harrasteet.iterator();
275 * i2.next() === pitsi21;
276 * i2.next() === pitsi11;
277 * i2.next() === pitsi22;
278 * i2.next() === pitsi12;
279 * i2.next() === pitsi23;
280 * i2.next() === pitsi12; #THROWS NoSuchElementException
281 *
282 * int n = 0;
283 * int jnrot[] = {2,1,2,1,2};
284 *
285 * for ( Harrastus har:harrasteet ) {
286 * har.getJasenNro() === jnrot[n]; n++;
287 * }
288 *
289 * n === 5;
290 *
291 * </pre>
292 */
293 @Override
294 public Iterator<Harrastus> iterator() {
295 return alkiot.iterator();
296 }
297
298
299 /**
300 * Haetaan kaikki jäsen harrastukset
301 * @param tunnusnro jäsenen tunnusnumero jolle harrastuksia haetaan
302 * @return tietorakenne jossa viiteet löydetteyihin harrastuksiin
303 * @example
304 * <pre name="test">
305 * #import java.util.*;
306 *
307 * Harrastukset harrasteet = new Harrastukset();
308 * Harrastus pitsi21 = new Harrastus(2); harrasteet.lisaa(pitsi21);
309 * Harrastus pitsi11 = new Harrastus(1); harrasteet.lisaa(pitsi11);
310 * Harrastus pitsi22 = new Harrastus(2); harrasteet.lisaa(pitsi22);
311 * Harrastus pitsi12 = new Harrastus(1); harrasteet.lisaa(pitsi12);
312 * Harrastus pitsi23 = new Harrastus(2); harrasteet.lisaa(pitsi23);
313 * Harrastus pitsi51 = new Harrastus(5); harrasteet.lisaa(pitsi51);
314 *
315 * List<Harrastus> loytyneet;
316 * loytyneet = harrasteet.annaHarrastukset(3);
317 * loytyneet.size() === 0;
318 * loytyneet = harrasteet.annaHarrastukset(1);
319 * loytyneet.size() === 2;
320 * loytyneet.get(0) == pitsi11 === true;
321 * loytyneet.get(1) == pitsi12 === true;
322 * loytyneet = harrasteet.annaHarrastukset(5);
323 * loytyneet.size() === 1;
324 * loytyneet.get(0) == pitsi51 === true;
325 * </pre>
326 */
327 public List<Harrastus> annaHarrastukset(int tunnusnro) {
328 List<Harrastus> loydetyt = new ArrayList<Harrastus>();
329 for (Harrastus har : alkiot)
330 if (har.getJasenNro() == tunnusnro) loydetyt.add(har);
331 return loydetyt;
332 }
333
334
335 /**
336 * Laitetaan muutos, jolloin pakotetaan tallentamaan.
337 */
338 public void setMuutos() {
339 muutettu = true;
340 }
341
342
343 /**
344 * Testiohjelma harrastuksille
345 * @param args ei käytössä
346 */
347 public static void main(String[] args) {
348 Harrastukset harrasteet = new Harrastukset();
349 Harrastus pitsi1 = new Harrastus();
350 pitsi1.vastaaPitsinNyplays(2);
351 Harrastus pitsi2 = new Harrastus();
352 pitsi2.vastaaPitsinNyplays(1);
353 Harrastus pitsi3 = new Harrastus();
354 pitsi3.vastaaPitsinNyplays(2);
355 Harrastus pitsi4 = new Harrastus();
356 pitsi4.vastaaPitsinNyplays(2);
357
358 harrasteet.lisaa(pitsi1);
359 harrasteet.lisaa(pitsi2);
360 harrasteet.lisaa(pitsi3);
361 harrasteet.lisaa(pitsi2);
362 harrasteet.lisaa(pitsi4);
363
364 System.out.println("============= Harrastukset testi =================");
365
366 List<Harrastus> harrastukset2 = harrasteet.annaHarrastukset(2);
367
368 for (Harrastus har : harrastukset2) {
369 System.out.print(har.getJasenNro() + " ");
370 har.tulosta(System.out);
371 }
372
373 }
374
375 }
376