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 public class Vertailija implements Comparator { 183 int k; 184 public Vertailija(int k) { this.k = k; } 185 186 public int compare(Object o1, Object o2) { 187 Jasen j1 = (Jasen)o1; 188 Jasen j2 = (Jasen)o2; 189 190 String s1 = j1.getAvain(k); 191 String s2 = j2.getAvain(k); 192 193 return s1.compareTo(s2); 194 195 } 196 197 } 198 199 public List etsi(int k, String hakuehto) { 200 List loytyneet = new ArrayList(); 201 202 for (Iterator i = iterator(); i.hasNext(); ) { 203 Jasen jasen = (Jasen)i.next(); 204 String kentta = jasen.anna(k); 205 if ( WildChars.onkoSamat(kentta,hakuehto) ) 206 loytyneet.add(jasen); 207 } 208 209 Collections.sort(loytyneet,new Vertailija(k)); 210 return loytyneet; 211 } 212 213 214 215 /** 216 * Testiohjelma jäsenistölle 217 * @param args ei käytössä 218 */ 219 public static void main(String args[]) { 220 Jasenet jasenet = new Jasenet(); 221 try { 222 jasenet.lue_tiedostosta("kelmit"); 223 } catch ( SailoException ex ) { 224 System.out.println("Virhe: " + ex.getMessage()); 225 } 226 227 Jasen aku = new Jasen(), aku2 = new Jasen(); 228 aku.rekisteroi(); aku.vastaa_aku_ankka(); 229 aku2.rekisteroi(); aku2.vastaa_aku_ankka(); 230 231 try { 232 jasenet.lisaa(aku); 233 jasenet.lisaa(aku2); 234 235 System.out.println("============= Jäsenet testi ================="); 236 237 // for (int i=0; i<jasenet.getLkm(); i++) { 238 for (Iterator i=jasenet.iterator(); i.hasNext(); ) { 239 // Jasen jasen = jasenet.anna(i); 240 Jasen jasen = (Jasen)i.next(); 241 System.out.println("Jäsen nro: " + jasen.getTunnus_nro()); 242 jasen.tulosta(System.out); 243 } 244 245 } catch ( SailoException ex ) { 246 System.out.println(ex.getMessage()); 247 } 248 249 try { 250 jasenet.talleta(); 251 } catch ( SailoException e ) { 252 System.out.println("Virhe: " + e.getMessage()); 253 } 254 255 } 256 257 } 258 259