1   package kerho;
2   
3   import java.io.BufferedReader;
4   import java.io.IOException;
5   import java.io.PrintWriter;
6   
7   import kanta.PerusTietueet;
8   import kanta.SailoException;
9   
10  /**
11   * Kerhon jäsenistö, joka osaa mm. lisätä uuden jäsenen
12   *
13   * @author Vesa Lappalainen
14   * @version 1.0, 22.02.2003
15   * @version 1.1, 19.02.2012 
16   * @version 1.2, 15.03.2012 
17   * @version 1.3, 24.03.2012 - Tietueet
18   *  
19   * @example
20   * <pre name="test_lisaa">
21   * // lisaa(Jasen)  
22   * #PACKAGEIMPORT
23   * #import kanta.SailoException;
24   * #import java.util.*;
25   * Jasenet jasenet = new Jasenet();
26   * Jasen aku1 = new Jasen(), aku2 = new Jasen();
27   * jasenet.getLkm() === 0;
28   * jasenet.lisaa(aku1); jasenet.getLkm() === 1;
29   * jasenet.lisaa(aku2); jasenet.getLkm() === 2;
30   * jasenet.lisaa(aku1); jasenet.getLkm() === 3;
31   * Iterator<Jasen> iter = jasenet.iterator();
32   * Jasen jasen0 = iter.next();
33   * Jasen jasen1 = iter.next();
34   * jasen0 === aku1;
35   * jasen1 === aku2;
36   * iter.next() === aku1;
37   * jasen1 == aku1 === false;
38   * jasen1 == aku2 === true;
39   * jasenet.lisaa(aku1); jasenet.getLkm() === 4;
40   * jasenet.lisaa(aku1); jasenet.getLkm() === 5;
41   * 
42   * jasenet = new Jasenet();
43   * for (int i=0; i<200; i++) {
44   *    jasenet.lisaa(aku1); jasenet.getLkm() === 2*i+1;
45   *    jasenet.lisaa(aku2); jasenet.getLkm() === 2*i+2;
46   * }  
47   * </pre>
48   * 
49   * @example
50   * <pre name="test_poista">
51   * // poista(int) 
52   * Jasenet jasenet = new Jasenet();
53   * Jasen aku1 = new Jasen(), aku2 = new Jasen(), aku3 = new Jasen();
54   * aku1.rekisteroi(); aku2.rekisteroi(); aku3.rekisteroi();
55   * int id1 = aku1.getTunnusNro();
56   * jasenet.lisaa(aku1); jasenet.lisaa(aku2); jasenet.lisaa(aku3);
57   * jasenet.poista(id1+1) === 1;
58   * jasenet.annaId(id1+1) === null; jasenet.getLkm() === 2;
59   * jasenet.poista(id1) === 1; jasenet.getLkm() === 1;
60   * jasenet.poista(id1+3) === 0; jasenet.getLkm() === 1;
61   * </pre>
62   * 
63   * @exmpale 
64   * <pre name="test_iterator">
65   * #THROWS CloneNotSupportedException
66   * // iterator()  
67   * #PACKAGEIMPORT
68   * Jasenet jasenet = new Jasenet();
69   * Jasen aku1 = new Jasen(), aku2 = new Jasen();
70   * aku1.rekisteroi(); aku2.rekisteroi();
71   * jasenet.getLkm() === 0;
72   * jasenet.korvaaTaiLisaa(aku1); jasenet.getLkm() === 1;
73   * jasenet.korvaaTaiLisaa(aku2); jasenet.getLkm() === 2;
74   * Jasen aku3 = aku1.clone();
75   * aku3.aseta(3,"kkk");
76   * Iterator<Jasen> iter = jasenet.iterator();
77   * Jasen jasen0 = iter.next();
78   * jasenet.korvaaTaiLisaa(aku3); jasenet.getLkm() === 2;
79   * iter = jasenet.iterator();
80   * jasen0 = iter.next();
81   * jasen0 === aku3;
82   * jasen0 == aku3 === true;
83   * jasen0 == aku1 === false;
84   * </pre>
85   * 
86   * @example
87   * <pre name="test_tiedosto">
88   * #THROWS SailoException 
89   * // lueTiedosto(String), talleta()
90   * #import java.io.File;
91   * 
92   *  Jasenet jasenet = new Jasenet();
93   *  Jasen aku1 = new Jasen(), aku2 = new Jasen();
94   *  aku1.vastaaAkuAnkka();
95   *  aku2.vastaaAkuAnkka();
96   *  String tiedNimi = "testikelmit";
97   *  File ftied = new File(tiedNimi+".dat");
98   *  ftied.delete();
99   *  jasenet.lueTiedostosta(tiedNimi); #THROWS SailoException
100  *  jasenet.lisaa(aku1);
101  *  jasenet.lisaa(aku2);
102  *  jasenet.talleta();
103  *  jasenet = new Jasenet();           // Poistetaan vanhat luomalla uusi
104  *  jasenet.lueTiedostosta(tiedNimi);  // johon ladataan tiedot tiedostosta.
105  *  Iterator<Jasen> i = jasenet.iterator();
106  *  i.next().toString() === aku1.toString();
107  *  i.next().toString() === aku2.toString();
108  *  i.hasNext() === false;
109  *  jasenet.lisaa(aku2);
110  *  jasenet.talleta();
111  *  ftied.delete() === true;
112  *  File fbak = new File(tiedNimi+".bak");
113  *  fbak.delete() === true;
114  * </pre>
115  * 
116  * @example
117  * <pre name="test_etsi">
118  * // etsi(String,int) 
119  *   Jasenet jasenet = new Jasenet();
120  *   Jasen jasen1 = new Jasen(); jasen1.parse("1|Ankka Aku|030201-115H|Ankkakuja 6|");
121  *   Jasen jasen2 = new Jasen(); jasen2.parse("2|Ankka Tupu||030552-123B|");
122  *   Jasen jasen3 = new Jasen(); jasen3.parse("3|Susi Sepe|121237-121V||131313|Perämetsä");
123  *   Jasen jasen4 = new Jasen(); jasen4.parse("4|Ankka Iines|030245-115V|Ankkakuja 9");
124  *   Jasen jasen5 = new Jasen(); jasen5.parse("5|Ankka Roope|091007-408U|Ankkakuja 12");
125  *   jasenet.lisaa(jasen1); jasenet.lisaa(jasen2); jasenet.lisaa(jasen3); jasenet.lisaa(jasen4); jasenet.lisaa(jasen5);
126  *   List<Jasen> loytyneet;
127  *   loytyneet = (List<Jasen>)jasenet.etsi("*s*",1);
128  *   loytyneet.size() === 2;
129  *   loytyneet.get(0) == jasen4 === true;
130  *   loytyneet.get(1) == jasen3 === true;
131  *   
132  *   loytyneet = (List<Jasen>)jasenet.etsi("*7-*",2);
133  *   loytyneet.size() === 2;
134  *   loytyneet.get(0) == jasen5 === true;
135  *   loytyneet.get(1) == jasen3 === true;
136  * </pre>
137  * @exmpale
138  *  
139  * <pre name="test_annaId">
140  * // annaId(int)
141  * Jasenet jasenet = new Jasenet();
142  * Jasen aku1 = new Jasen(), aku2 = new Jasen(), aku3 = new Jasen();
143  * aku1.rekisteroi(); aku2.rekisteroi(); aku3.rekisteroi();
144  * int id1 = aku1.getTunnusNro();
145  * jasenet.lisaa(aku1); jasenet.lisaa(aku2); jasenet.lisaa(aku3);
146  * jasenet.annaId(id1  ) == aku1 === true;
147  * jasenet.annaId(id1+1) == aku2 === true;
148  * jasenet.annaId(id1+2) == aku3 === true;
149  * </pre>
150  */
151 public class Jasenet extends PerusTietueet<Jasen> {
152     private String kokoNimi = "";
153 
154 
155     /**
156      * Oletusmuodostaja jolla tulee täysin dynaaminen koko.
157      */
158     public Jasenet() {
159         super(new Jasen());
160     }
161 
162 
163 
164 
165 
166     /**
167      * Palauttaa viitteen i:teen jäseneen.
168      * @param i monennenko jäsenen viite halutaan
169      * @return viite jäseneen, jonka indeksi on i
170      * @throws IndexOutOfBoundsException jos i ei ole sallitulla alueella  
171     public Jasen anna(int i) throws IndexOutOfBoundsException {
172         if (i < 0 || lkm <= i) throw new IndexOutOfBoundsException("Laiton indeksi: " + i);
173         return alkiot[i];
174     }
175     */
176 
177     /**
178      * Lukee rivit tiedoston alusta
179      * @param fi virta josta luetaan
180      * @throws IOException jos jokin menee vikaan
181      * @throws SailoException jos tieto virheellistä
182      */
183     @Override
184     protected void lueAlkurivit(BufferedReader fi) throws IOException, SailoException {
185         kokoNimi = fi.readLine();
186         if (kokoNimi == null) throw new SailoException("Kerhon nimi puuttuu");
187         String rivi = fi.readLine();
188         if (rivi == null) throw new SailoException("Maksimikoko puuttuu");
189     }
190 
191 
192     /**
193      * Tiedoston alkuun tulevat rivit
194      * @param fo virta johon talletetaan
195      */
196     @Override
197     protected void teeAlkutalletus(PrintWriter fo) {
198         fo.println(getKokoNimi());
199         fo.println(getLkm());
200     }
201 
202 
203     /**
204      * Palauttaa Kerhon koko nimen
205      * @return Kerhon koko nimi merkkijononna
206      */
207     public String getKokoNimi() {
208         return kokoNimi;
209     }
210 
211 
212     /**
213      * Testiohjelma jäsenistölle
214      * @param args ei käytössä
215      */
216     public static void main(String args[]) {
217         Jasenet jasenet = new Jasenet();
218 
219         Jasen aku = new Jasen(), aku2 = new Jasen();
220         aku.rekisteroi();
221         aku.vastaaAkuAnkka();
222         aku2.rekisteroi();
223         aku2.vastaaAkuAnkka();
224 
225         jasenet.lisaa(aku);
226         jasenet.lisaa(aku2);
227 
228         System.out.println("============= Jäsenet testi =================");
229 
230         int i = 0;
231         for (Jasen jasen:jasenet) {
232             System.out.println("Jäsen paikassa: " + i++);
233             jasen.tulosta(System.out);
234         }
235 
236     }
237 
238 }
239