001 import java.io.*; 002 import fi.jyu.mit.ohj2.*; 003 import java.util.*; 004 /** 005 * Kerhon harrastukset joka osaa mm. lisätä uuden harrastuksen 006 * 007 * @author Vesa Lappalainen 008 * @version 1.0, 20.03.2003 009 */ 010 public class Harrastukset { 011 private boolean muutettu = false; 012 private String nimi = ""; 013 private Collection alkiot = new ArrayList(); 014 015 public Harrastukset() { } 016 017 /** 018 * Lisää uuden harrastuksen tietorakenteeseen. Ottaa harastuksen omistukseensa. 019 * @param har lisätäävän harrastusken viite. 020 * Huom tietorakenne muuttuu omistajaksi. 021 */ 022 public void lisaa(Harrastus har) { 023 alkiot.add(har); 024 muutettu = true; 025 } 026 027 028 /** 029 * Lukee harrastukset tiedostosta. 030 * @param tied tiedoston nimen alkuosa 031 * @throws SailoException jos lukeminen epäonnistuu 032 */ 033 public void lue_tiedostosta(String tied) throws SailoException { 034 nimi = tied; 035 BufferedReader fi = Tiedosto.avaa_lukemista_varten(getTiedoston_nimi()); 036 if ( fi == null ) throw new SailoException("Tiedosto " + getTiedoston_nimi() + " ei aukea"); 037 038 String rivi; 039 try { 040 while ( ( rivi = fi.readLine() ) != null ) { 041 rivi = rivi.trim(); 042 if ( rivi.equals("") || rivi.startsWith(";") ) continue; 043 Harrastus har = new Harrastus(); 044 har.parse(rivi); // voisi olla virhekäsittely 045 lisaa(har); 046 } 047 muutettu = false; 048 049 } catch ( IOException e ) { 050 051 052 } finally { 053 try { 054 fi.close(); 055 } catch (IOException ex) { 056 } 057 } 058 } 059 060 /** 061 * Tallentaa harrastukset tiedostoon. 062 * @throws SailoException jos talletus epäonnistuu 063 */ 064 public void talleta() throws SailoException { 065 if ( !muutettu ) return; 066 067 File fbak = new File(getBak_nimi()); 068 File ftied = new File(getTiedoston_nimi()); 069 if ( !fbak.delete() ) ; //System.err.println("Ei voi tuhota"); 070 if ( !ftied.renameTo(fbak) ) ; //System.err.println("Ei voi nimetä"); 071 072 PrintWriter fo = Tiedosto.avaa_kirjoittamista_varten(ftied.getName()); 073 if ( fo == null ) 074 throw new SailoException("Tiedosto " + ftied.getName() + "ei aukea"); 075 try { 076 for (Iterator i=iterator(); i.hasNext(); ) { 077 Harrastus har = (Harrastus)i.next(); 078 fo.println(har.toString()); 079 } 080 } finally { 081 fo.close(); 082 } 083 084 muutettu = false; 085 } 086 087 /** 088 * Palauttaa kerhon harrastusten lukumäärän 089 * @return harrastusten lukumäärä 090 */ 091 public int getLkm() { return alkiot.size(); } 092 093 /** 094 * Palauttaa tiedoston nimen, jota käytetään tallennukseen 095 * @return tallennustiedoston nimi 096 */ 097 public String getTiedoston_nimi() { return nimi + ".har"; } 098 099 /** 100 * Palauttaa varakopiotiedoston nimen 101 * @return varakopiotiedoston nimi 102 */ 103 public String getBak_nimi() { return nimi + ".hbak"; } 104 105 /** 106 * Palauttaa iteraattorin jolla kaikki harrastukset voidaan käydä lävitse 107 * @return iteraattori kaikkien läpikäymiseen 108 */ 109 public Iterator iterator() { 110 return alkiot.iterator(); 111 } 112 113 /** 114 * Iteraattori, jolla käydään lävitse tietyn henkilön harrastukset. 115 * @author Vesa Lappalainen 116 * @version 1.0, 20.03.2003 117 */ 118 public class HarrastuksetIterator implements Iterator { 119 private int jasenid; 120 private Iterator iter = alkiot.iterator(); 121 private Harrastus seuraava = null; 122 123 public HarrastuksetIterator(int jid) { 124 jasenid = jid; 125 } 126 127 public boolean hasNext() { 128 if ( seuraava != null ) return true; 129 while ( true ) { 130 if ( !iter.hasNext() ) return false; 131 seuraava = (Harrastus)iter.next(); 132 if ( seuraava.getJasen_id()== jasenid ) return true; 133 } 134 } 135 136 public Object next() throws NoSuchElementException { 137 if ( seuraava != null ) { 138 Harrastus pal = seuraava; 139 seuraava = null; 140 return pal; 141 } 142 while ( true ) { 143 Harrastus har = (Harrastus)iter.next(); 144 if ( har.getJasen_id()== jasenid ) return har; 145 } 146 } 147 148 public void remove() throws UnsupportedOperationException { 149 throw new UnsupportedOperationException("Me ei poisteta"); 150 } 151 152 } 153 154 /** 155 * Palauttaa iteraattorin jolla tietyn jäsenen harrastukset voidaan 156 * käydä lävitse 157 * @param jasen_id minkä jäsenen harrastukset iteroidaan 158 * @return iteraattori valitun jäsenen harrastusten läpikäymiseen 159 */ 160 public Iterator iterator(int jasen_id) { 161 return new HarrastuksetIterator(jasen_id); 162 } 163 164 private static void testi(Object o) { 165 Harrastus har = (Harrastus)o; 166 System.out.print(har.getJasen_id() + " "); 167 har.tulosta(System.out); 168 } 169 170 /** 171 * Testiohjelma harrastuksille 172 * @param args ei käytössä 173 */ 174 public static void main(String args[]) { 175 Harrastukset harrasteet = new Harrastukset(); 176 Harrastus pitsi1 = new Harrastus(); 177 pitsi1.vastaa_pitsin_nyplays(2); 178 Harrastus pitsi2 = new Harrastus(); 179 pitsi2.vastaa_pitsin_nyplays(1); 180 Harrastus pitsi3 = new Harrastus(); 181 pitsi3.vastaa_pitsin_nyplays(2); 182 Harrastus pitsi4 = new Harrastus(); 183 pitsi4.vastaa_pitsin_nyplays(2); 184 185 harrasteet.lisaa(pitsi1); 186 harrasteet.lisaa(pitsi2); 187 harrasteet.lisaa(pitsi3); 188 harrasteet.lisaa(pitsi2); 189 harrasteet.lisaa(pitsi4); 190 191 System.out.println("============= Harrastukset testi ================="); 192 193 194 for (Iterator i=harrasteet.iterator(2); i.hasNext(); ) { 195 testi(i.next()); 196 } 197 { // Testataan toimiiko iteraattori ilman hasNextiä 198 System.out.println("============= Iteraattori testi ================="); 199 Iterator i=harrasteet.iterator(2); 200 System.out.println(i.hasNext() + " " + i.hasNext()); 201 testi(i.next()); 202 System.out.println(i.hasNext() + " " + i.hasNext()); 203 testi(i.next()); 204 System.out.println(i.hasNext() + " " + i.hasNext()); 205 testi(i.next()); 206 System.out.println(i.hasNext() + " " + i.hasNext()); 207 } 208 209 } 210 211 } 212 213