001 import java.io.*;
002 import java.util.*;
003 import fi.jyu.mit.ohj2.*;
004 /**
005 * Kerhon jäsenistö joka osaa mm. lisätä uuden jäsenen
006 *
007 * @author Vesa Lappalainen
008 * @version 1.0, 22.02.2003
009 * @version 1.1, 20.03.2003
010 */
011 public class Jasenet {
012 private static final int MAX_JASENIA = 25;
013 private int lkm = 0;
014 private boolean muutettu = false;
015 private String nimi = "";
016 private String koko_nimi = "";
017 private Jasen alkiot[] = new Jasen[MAX_JASENIA];
018
019 public Jasenet() { }
020
021 /**
022 * Lisää uuden jäsenen tietorakenteeseen. Ottaa jäsenen omistukseensa.
023 * @param jasen lisätäävän jäsnen viite. Huom tietorakenne muuttuu omistajaksi
024 * @throws SailoException jos tietorakennen on jo täynnä
025 */
026 public void lisaa(Jasen jasen) throws SailoException {
027 muutettu = true;
028 if ( lkm >= alkiot.length ) throw new SailoException("Liikaa alkioita");
029 alkiot[lkm] = jasen;
030 lkm++;
031 }
032
033
034 /**
035 * Palauttaa viitteen i:teen jäseneen.
036 * @param i monennenko jäsenen viite halutaan
037 * @return viite jäseneen, jonka indeksi on i
038 * @throws SailoException jos i ei ole sallitulla alueella
039 */
040 public Jasen anna(int i) throws SailoException {
041 if ( i < 0 || lkm <= i ) throw new SailoException("Laiton indeksi " + i);
042 return alkiot[i];
043 }
044
045
046
047
048
049 /**
050 * Lukee jäsenistön tiedostosta. Kesken.
051 * @param tied tiedoston nimen alkuosa
052 * @throws SailoException jos lukeminen epäonnistuu
053 */
054 public void lue_tiedostosta(String tied) throws SailoException {
055 nimi = tied;
056 BufferedReader fi = Tiedosto.avaa_lukemista_varten(getTiedoston_nimi());
057 if ( fi == null ) throw new SailoException("Tiedosto " + getTiedoston_nimi() + " ei aukea");
058
059 try {
060 koko_nimi = fi.readLine();
061 if ( koko_nimi == null ) throw new SailoException("xxxxx");
062 String rivi = fi.readLine();
063 if ( rivi == null ) throw new SailoException("xxxxx");
064 int max_koko = Mjonot.erotaInt(rivi,10); // tehdään jotakin
065
066 while ( ( rivi = fi.readLine() ) != null ) {
067 rivi = rivi.trim();
068 if ( rivi.equals("") || rivi.startsWith(";") ) continue;
069 Jasen jasen = new Jasen();
070 jasen.parse(rivi); // voisi olla virhekäsittely
071 lisaa(jasen);
072 }
073 muutettu = false;
074
075
076 } catch ( IOException e ) {
077
078
079 } finally {
080 try {
081 fi.close();
082 } catch (IOException ex) {
083 }
084 }
085 }
086
087 /**
088 * Tallentaa jäsenistön tiedostoon. Kesken.
089 * Tiedoston muoto:
090 * <pre>
091 * Kelmien kerho
092 * 20
093 * ; kommenttirivi
094 * 2|Ankka Aku|121103-706Y|Ankkakuja 6|12345|ANKKALINNA|12-1234|||1996|50.0|30.0|Velkaa Roopelle
095 * 3|Ankka Tupu|121153-706Y|Ankkakuja 6|12345|ANKKALINNA|12-1234|||1996|50.0|30.0|Velkaa Roopelle
096 * </pre>
097 * @throws SailoException jos talletus epäonnistuu
098 */
099 public void talleta() throws SailoException {
100 if ( !muutettu ) return;
101
102 File fbak = new File(getBak_nimi());
103 File ftied = new File(getTiedoston_nimi());
104 if ( !fbak.delete() ) ; //System.err.println("Ei voi tuhota");
105 if ( !ftied.renameTo(fbak) ) ; //System.err.println("Ei voi nimetä");
106
107 PrintWriter fo = Tiedosto.avaa_kirjoittamista_varten(ftied.getName());
108 if ( fo == null )
109 throw new SailoException("Tiedosto " + ftied.getName() + "ei aukea");
110 try {
111 fo.println(getKoko_nimi());
112 fo.println(alkiot.length);
113 for (Iterator i=iterator(); i.hasNext(); ) {
114 Jasen jasen = (Jasen)i.next();
115 fo.println(jasen.toString());
116 }
117 // } catch ( IOException e ) {
118 } finally {
119 fo.close();
120 }
121
122 muutettu = false;
123 }
124
125 /**
126 * Palauttaa Kerhon koko nimen
127 * @return Kerhon koko nimi merkkijononna
128 */
129 public String getKoko_nimi() { return koko_nimi; }
130
131 /**
132 * Palauttaa kerhon jäsenten lukumäärän
133 * @return jäsenten lukumäärä
134 */
135 public int getLkm() { return lkm; }
136
137 /**
138 * Palauttaa tiedoston nimen, jota käytetään tallennukseen
139 * @return tallennustiedoston nimi
140 */
141 public String getTiedoston_nimi() { return nimi + ".dat"; }
142
143 /**
144 * Palauttaa varakopiotiedoston nimen
145 * @return varakopiotiedoston nimi
146 */
147 public String getBak_nimi() { return nimi + ".bak"; }
148
149 /**
150 * Iteraattorin implementointi.
151 * @author Vesa Lappalainen
152 * @version 1.0, 20.03.2003
153 */
154 public class JasenetIterator implements Iterator {
155 private int kohdalla = -1;
156
157 public boolean hasNext() {
158 // if ( kohdalla + 1 >= lkm ) return false;
159 // return true;
160 return kohdalla + 1 < lkm;
161 }
162
163 public Object next() throws NoSuchElementException {
164 if ( !hasNext() ) throw new NoSuchElementException("Ei oo");
165 kohdalla++;
166 return alkiot[kohdalla];
167 }
168
169 public void remove() throws UnsupportedOperationException {
170 throw new UnsupportedOperationException("Me ei poisteta");
171 }
172 }
173
174 /**
175 * Palauttaa iteraattorin jolla kaikki jäsenet voidaan käydä lävitse
176 * @return iteraattori kaikkien läpikäymiseen
177 */
178 public Iterator iterator() {
179 return new JasenetIterator();
180 }
181
182
183
184 /**
185 * Testiohjelma jäsenistölle
186 * @param args ei käytössä
187 */
188 public static void main(String args[]) {
189 Jasenet jasenet = new Jasenet();
190 try {
191 jasenet.lue_tiedostosta("kelmit");
192 } catch ( SailoException ex ) {
193 System.out.println("Virhe: " + ex.getMessage());
194 }
195
196 Jasen aku = new Jasen(), aku2 = new Jasen();
197 aku.rekisteroi(); aku.vastaa_aku_ankka();
198 aku2.rekisteroi(); aku2.vastaa_aku_ankka();
199
200 try {
201 jasenet.lisaa(aku);
202 jasenet.lisaa(aku2);
203
204 System.out.println("============= Jäsenet testi =================");
205
206 // for (int i=0; i<jasenet.getLkm(); i++) {
207 for (Iterator i=jasenet.iterator(); i.hasNext(); ) {
208 // Jasen jasen = jasenet.anna(i);
209 Jasen jasen = (Jasen)i.next();
210 System.out.println("Jäsen nro: " + jasen.getTunnus_nro());
211 jasen.tulosta(System.out);
212 }
213
214 } catch ( SailoException ex ) {
215 System.out.println(ex.getMessage());
216 }
217
218 try {
219 jasenet.talleta();
220 } catch ( SailoException e ) {
221 System.out.println("Virhe: " + e.getMessage());
222 }
223
224 }
225
226 }
227
228