| Jasenet.java |
1 package kerho;
2
3 import java.util.Iterator;
4 import java.util.NoSuchElementException;
5
6
7 /**
8 * Kerhon jäsenistö joka osaa mm. lisätä uuden jäsenen
9 *
10 * @author Vesa Lappalainen
11 * @version 1.0, 22.02.2003
12 */
13 public class Jasenet implements Iterable<Jasen> {
14 //private boolean muutettu = false;
15 private String tiedostonNimi = "";
16 private String bakNimi = "";
17 private String kokoNimi = "";
18
19 private static final int MAX_JASENIA = 5;
20 private int lkm = 0;
21
22 /**
23 * Taulukko jäsenistä
24 */
25 private Jasen alkiot[] = new Jasen[MAX_JASENIA];
26
27
28 /**
29 * Oletusmuodostaja
30 */
31 public Jasenet() {
32 // Attribuuttien oma alustus riittää
33 }
34
35
36 /**
37 * Lisää uuden jäsenen tietorakenteeseen. Ottaa jäsenen omistukseensa.
38 * @param jasen lisätäävän jäsenen viite. Huom tietorakenne muuttuu omistajaksi
39 * @throws SailoException jos tietorakenne on jo täynnä
40 * @example
41 * <pre name="test">
42 * #THROWS SailoException
43 * #PACKAGEIMPORT
44 * Jasenet jasenet = new Jasenet();
45 * Jasen aku1 = new Jasen(), aku2 = new Jasen();
46 * jasenet.getLkm() === 0;
47 * jasenet.lisaa(aku1); jasenet.getLkm() === 1;
48 * jasenet.lisaa(aku2); jasenet.getLkm() === 2;
49 * jasenet.lisaa(aku1); jasenet.getLkm() === 3;
50 * jasenet.anna(0) === aku1;
51 * jasenet.anna(1) === aku2;
52 * jasenet.anna(2) === aku1;
53 * jasenet.anna(1) == aku1 === false;
54 * jasenet.anna(1) == aku2 === true;
55 * jasenet.anna(3) === aku1; #THROWS IndexOutOfBoundsException
56 * jasenet.lisaa(aku1); jasenet.getLkm() === 4;
57 * jasenet.lisaa(aku1); jasenet.getLkm() === 5;
58 * jasenet.lisaa(aku1); #THROWS SailoException
59 * </pre>
60 */
61 public void lisaa(Jasen jasen) throws SailoException {
62 if ( lkm >= alkiot.length ) throw new SailoException("Liikaa alkioita");
63 alkiot[lkm] = jasen;
64 lkm++;
65 }
66
67
68 /**
69 * Palauttaa viitteen i:teen jäseneen.
70 * @param i monennenko jäsenen viite halutaan
71 * @return viite jäseneen, jonka indeksi on i
72 * @throws IndexOutOfBoundsException jos i ei ole sallitulla alueella
73 */
74 public Jasen anna(int i) throws IndexOutOfBoundsException {
75 if ( i < 0 || lkm <= i ) throw new IndexOutOfBoundsException("Laiton indeksi: " + i);
76 return alkiot[i];
77 }
78
79
80 /**
81 * Lukee jäsenistön tiedostosta. Kesken.
82 * @param tied tiedoston nimen alkuosa
83 * @throws SailoException jos lukeminen epäonnistuu
84 */
85 public void lueTiedostosta(String tied) throws SailoException {
86 tiedostonNimi = tied + ".dat";
87 kokoNimi = "Kelmien kerho";
88 }
89
90
91 /**
92 * Tallentaa jäsenistön tiedostoon. Kesken.
93 * @throws SailoException jos talletus epäonnistuu
94 */
95 public void talleta() throws SailoException {
96 // Ei vielä tee mitään
97 }
98
99
100 /**
101 * Palauttaa Kerhon koko nimen
102 * @return Kerhon koko nimi merkkijononna
103 */
104 public String getKokoNimi() { return kokoNimi; }
105
106
107 /**
108 * Palauttaa kerhon jäsenten lukumäärän
109 * @return jäsenten lukumäärä
110 */
111 public int getLkm() { return lkm; }
112
113
114 /**
115 * Palauttaa tiedoston nimen, jota käytetään tallennukseen
116 * @return tallennustiedoston nimi
117 */
118 public String getTiedostonNimi() { return tiedostonNimi; }
119
120
121 /**
122 * Palauttaa varakopiotiedoston nimen
123 * @return varakopiotiedoston nimi
124 */
125 public String getBakNimi() { return bakNimi; }
126
127
128 /**
129 * Tekee nykyisestä tiedostosta varakopiotiedoston. Kesken.
130 * @param bak_tark tarkennin varakopioiedostoille
131 * @return onnistuiko (true) vai ei (false)
132 */
133 public boolean teeBak(String bak_tark) { bakNimi = bak_tark; return true; }
134
135 /**
136 * Luokka jäsenten iteroimiseksi.
137 * @example
138 * <pre name="test">
139 * #THROWS SailoException
140 * #PACKAGEIMPORT
141 * #import java.util.*;
142 *
143 * Jasenet jasenet = new Jasenet();
144 * Jasen aku1 = new Jasen(), aku2 = new Jasen();
145 * aku1.rekisteroi(); aku2.rekisteroi();
146 *
147 * jasenet.lisaa(aku1);
148 * jasenet.lisaa(aku2);
149 * jasenet.lisaa(aku1);
150 *
151 * StringBuffer ids = new StringBuffer(30);
152 * for (Jasen jasen:jasenet)
153 * ids.append(" "+jasen.getTunnusNro()); // NOPMD
154 *
155 * String tulos = " " + aku1.getTunnusNro() + " " + aku2.getTunnusNro() + " " + aku1.getTunnusNro();
156 *
157 * ids.toString() === tulos;
158 *
159 * ids = new StringBuffer(30);
160 * for (Iterator<Jasen> i=jasenet.iterator(); i.hasNext(); ) {
161 * Jasen jasen = i.next();
162 * ids.append(" "+jasen.getTunnusNro()); // NOPMD
163 * }
164 *
165 * ids.toString() === tulos;
166 *
167 * Iterator<Jasen> i=jasenet.iterator();
168 * i.next() == aku1 === true;
169 * i.next() == aku2 === true;
170 * i.next() == aku1 === true;
171 *
172 * i.next(); #THROWS NoSuchElementException
173 *
174 * </pre>
175 */
176 public class JasenetIterator implements Iterator<Jasen> {
177 private int kohdalla = -1;
178
179 /**
180 * Onko olemassa vielä seuraavaa jäsentä
181 * @see java.util.Iterator#hasNext()
182 * @return true jos on vielä jäseniä
183 */
184 public boolean hasNext() {
185 // if ( kohdalla + 1 >= lkm ) return false;
186 // return true;
187 return kohdalla + 1 < lkm;
188 }
189
190
191 /**
192 * Annetaan seuraava jäsen
193 * @return seuraava jäsen
194 * @throws NoSuchElementException jos seuraava alkiota ei enää ole
195 * @see java.util.Iterator#next()
196 */
197 public Jasen next() throws NoSuchElementException {
198 if ( !hasNext() ) throw new NoSuchElementException("Ei oo");
199 kohdalla++;
200 return alkiot[kohdalla];
201 }
202
203
204
205 /**
206 * Tuhoamista ei ole toteutettu
207 * @throws UnsupportedOperationException aina
208 * @see java.util.Iterator#remove()
209 */
210 public void remove() throws UnsupportedOperationException {
211 throw new UnsupportedOperationException("Me ei poisteta");
212 }
213 }
214
215 /**
216 * Palautetaan iteraattori jäsenistöön.
217 * @return jäsen iteraattori
218 */
219 public Iterator<Jasen> iterator() {
220 // return alkiot.iterator();
221 return new JasenetIterator();
222 }
223
224
225 /**
226 * Testiohjelma jäsenistölle
227 * @param args ei käytössä
228 */
229 public static void main(String args[]) {
230 Jasenet jasenet = new Jasenet();
231
232 Jasen aku = new Jasen(), aku2 = new Jasen();
233 aku.rekisteroi(); aku.vastaaAkuAnkka();
234 aku2.rekisteroi(); aku2.vastaaAkuAnkka();
235
236 try {
237 jasenet.lisaa(aku);
238 jasenet.lisaa(aku2);
239
240 System.out.println("============= Jäsenet testi =================");
241
242 for (Iterator<Jasen> i=jasenet.iterator(); i.hasNext(); ) {
243 // Jasen jasen = jasenet.anna(i);
244 // System.out.println("Jäsen nro: " + i);
245 Jasen jasen = i.next();
246 jasen.tulosta(System.out);
247 }
248 jasenet.anna(100);
249
250 } catch ( IndexOutOfBoundsException ex ) {
251 System.out.println(ex.getMessage());
252 } catch ( SailoException ex ) {
253 System.out.println(ex.getMessage());
254 }
255 }
256
257 }
258
259
260