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