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