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