001    import java.io.*;
002    import fi.jyu.mit.ohj2.*;
003    import java.util.*;
004    /**
005     * Kerhon jäsenistö joka osaa mm. lisätä uuden jäsenen
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 tiedoston_nimi = "";
013      private String bak_nimi = "";
014      private String koko_nimi = "";
015      private Collection alkiot = new ArrayList();
016    
017      public Harrastukset() {  }
018    
019      /**
020       * Poikkeusluokka tietorakenteesta aiheutuville poikkeuksille.
021       * @author Vesa Lappalainen
022       * @version 1.0, 22.02.2003
023       */
024      public class SailoException extends Exception {
025        public SailoException(String viesti) { super(viesti); }
026      }
027    
028      /**
029       * Lisää uuden harrastuksen tietorakenteeseen.  Ottaa harastuksen omistukseensa.
030       * @param har lisätäävän jäsnen viite.  Huom tietorakenne muuttuu omistajaksi
031       */
032      public void lisaa(Harrastus har) {
033        alkiot.add(har);
034      }
035    
036    
037      /**
038       * Lukee jäsenistön tiedostosta.  Kesken.
039       * @param tied tiedoston nimen alkuosa
040       * @throws SailoException jos lukeminen epäonnistuu
041       */
042      public void lue_tiedostosta(String tied) throws SailoException {
043        tiedoston_nimi = tied + ".dat";
044        koko_nimi = "Kelmien kerho";
045      }
046    
047      /**
048       * Tallentaa jäsenistön tiedostoon.  Kesken.
049       * @throws SailoException jos talletus epäonnistuu
050       */
051      public void talleta() { }
052    
053      /**
054       * Palauttaa Kerhon koko nimen
055       * @return Kerhon koko nimi merkkijononna
056       */
057      public String getKoko_nimi()           { return koko_nimi;                   }
058    
059      /**
060       * Palauttaa kerhon harrastusten lukumäärän
061       * @return harrastusten lukumäärä
062       */
063      public int getLkm()                    { return alkiot.size();               }
064    
065      /**
066       * Palauttaa tiedoston nimen, jota käytetään tallennukseen
067       * @return tallennustiedoston nimi
068       */
069      public String getTiedoston_nimi()      { return tiedoston_nimi;              }
070    
071      /**
072       * Palauttaa varakopiotiedoston nimen
073       * @return varakopiotiedoston nimi
074       */
075      public String getBak_nimi()            { return bak_nimi;                    }
076    
077      /**
078       * Tekee nykyisestä tiedostosta varakopiotiedoston. Kesken.
079       * @param bak_tark tarkennin varakopioiedostoille
080       * @return onnistuiko (true) vai ei (false)
081       */
082      public boolean TeeBak(String bak_tark) { bak_nimi = bak_tark; return true;   }
083    
084      /**
085       * Palauttaa iteraattorin jolla kaikki harrastukset voidaan käydä lävitse
086       * @return iteraattori kaikkien läpikäymiseen
087       */
088      public Iterator iterator() {
089        return alkiot.iterator();
090      }
091    
092      /**
093       * Iteraattori, jolla käydään lävitse tietyn henkilön harrastukset.
094       * @author Vesa Lappalainen
095       * @version 1.0, 20.03.2003
096       */
097      public class HarrastuksetIterator implements Iterator {
098        private int jasenid;
099        private Iterator iter = alkiot.iterator();
100        private Harrastus seuraava = null;
101    
102        public HarrastuksetIterator(int jid) {
103          jasenid = jid;
104        }
105    
106        public boolean hasNext() {
107          if ( seuraava != null ) return true;
108          while ( true ) {
109            if ( !iter.hasNext() ) return false;
110            seuraava = (Harrastus)iter.next();
111            if ( seuraava.getJasen_id()== jasenid ) return true;
112          }
113        }
114    
115        public Object next() throws NoSuchElementException {
116          if ( seuraava != null ) {
117            Harrastus pal = seuraava;
118            seuraava = null;
119            return pal;
120          }
121          while ( true ) {
122            Harrastus har = (Harrastus)iter.next();
123            if ( har.getJasen_id()== jasenid ) return har;
124          }
125        }
126    
127        public void remove() throws UnsupportedOperationException {
128          throw new UnsupportedOperationException("Me ei poisteta");
129        }
130    
131      }
132    
133      /**
134       * Palauttaa iteraattorin jolla tietyn jäsenen harrastukset voidaan
135       * käydä lävitse
136       * @param jasen_id minkä jäsenen harrastukset iteroidaan
137       * @return iteraattori valitun jäsenen harrastusten läpikäymiseen
138       */
139      public Iterator iterator(int jasen_id) {
140        return new HarrastuksetIterator(jasen_id);
141      }
142    
143      private static void testi(Object o) {
144        Harrastus har = (Harrastus)o;
145        System.out.print(har.getJasen_id() + " ");
146        har.tulosta(System.out);
147      }
148    
149      /**
150       * Testiohjelma harrastuksille
151       * @param args ei käytössä
152       */
153      public static void main(String args[]) {
154        Harrastukset harrasteet = new Harrastukset();
155        Harrastus pitsi1 = new Harrastus();
156        pitsi1.vastaa_pitsin_nyplays(2);
157        Harrastus pitsi2 = new Harrastus();
158        pitsi2.vastaa_pitsin_nyplays(1);
159        Harrastus pitsi3 = new Harrastus();
160        pitsi3.vastaa_pitsin_nyplays(2);
161        Harrastus pitsi4 = new Harrastus();
162        pitsi4.vastaa_pitsin_nyplays(2);
163    
164        harrasteet.lisaa(pitsi1);
165        harrasteet.lisaa(pitsi2);
166        harrasteet.lisaa(pitsi3);
167        harrasteet.lisaa(pitsi2);
168        harrasteet.lisaa(pitsi4);
169    
170        System.out.println("============= Harrastukset testi =================");
171    
172    
173        for (Iterator i=harrasteet.iterator(2); i.hasNext(); ) {
174          testi(i.next());
175        }
176        { // Testataan toimiiko iteraattori ilman hasNextiä
177          System.out.println("============= Iteraattori testi =================");
178          Iterator i=harrasteet.iterator(2);
179          System.out.println(i.hasNext() + " " + i.hasNext());
180          testi(i.next());
181          System.out.println(i.hasNext() + " " + i.hasNext());
182          testi(i.next());
183          System.out.println(i.hasNext() + " " + i.hasNext());
184          testi(i.next());
185          System.out.println(i.hasNext() + " " + i.hasNext());
186        }
187    
188      }
189    
190    }
191    
192