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