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