1   import java.io.*;
2   import fi.jyu.mit.ohj2.*;
3   import java.util.*;
4   /**
5    * Kerhon jäsenistö joka osaa mm. lisätä uuden jäsenen
6    *
7    * @author Vesa Lappalainen
8    * @version 1.0, 20.03.2003
9    */
10  public class Harrastukset {
11    private boolean muutettu = false;
12    private String tiedoston_nimi = "";
13    private String bak_nimi = "";
14    private String koko_nimi = "";
15    private Collection alkiot = new ArrayList();
16  
17    public Harrastukset() {  }
18  
19    /**
20     * Poikkeusluokka tietorakenteesta aiheutuville poikkeuksille.
21     * @author Vesa Lappalainen
22     * @version 1.0, 22.02.2003
23     */
24    public class SailoException extends Exception {
25      public SailoException(String viesti) { super(viesti); }
26    }
27  
28    /**
29     * Lisää uuden harrastuksen tietorakenteeseen.  Ottaa harastuksen omistukseensa.
30     * @param har lisätäävän jäsnen viite.  Huom tietorakenne muuttuu omistajaksi
31     */
32    public void lisaa(Harrastus har) {
33      alkiot.add(har);
34    }
35  
36  
37    /**
38     * Lukee jäsenistön tiedostosta.  Kesken.
39     * @param tied tiedoston nimen alkuosa
40     * @throws SailoException jos lukeminen epäonnistuu
41     */
42    public void lue_tiedostosta(String tied) throws SailoException {
43      tiedoston_nimi = tied + ".dat";
44      koko_nimi = "Kelmien kerho";
45    }
46  
47    /**
48     * Tallentaa jäsenistön tiedostoon.  Kesken.
49     * @throws SailoException jos talletus epäonnistuu
50     */
51    public void talleta() { }
52  
53    /**
54     * Palauttaa Kerhon koko nimen
55     * @return Kerhon koko nimi merkkijononna
56     */
57    public String getKoko_nimi()           { return koko_nimi;                   }
58  
59    /**
60     * Palauttaa kerhon harrastusten lukumäärän
61     * @return harrastusten lukumäärä
62     */
63    public int getLkm()                    { return alkiot.size();               }
64  
65    /**
66     * Palauttaa tiedoston nimen, jota käytetään tallennukseen
67     * @return tallennustiedoston nimi
68     */
69    public String getTiedoston_nimi()      { return tiedoston_nimi;              }
70  
71    /**
72     * Palauttaa varakopiotiedoston nimen
73     * @return varakopiotiedoston nimi
74     */
75    public String getBak_nimi()            { return bak_nimi;                    }
76  
77    /**
78     * Tekee nykyisestä tiedostosta varakopiotiedoston. Kesken.
79     * @param bak_tark tarkennin varakopioiedostoille
80     * @return onnistuiko (true) vai ei (false)
81     */
82    public boolean TeeBak(String bak_tark) { bak_nimi = bak_tark; return true;   }
83  
84    /**
85     * Palauttaa iteraattorin jolla kaikki harrastukset voidaan käydä lävitse
86     * @return iteraattori kaikkien läpikäymiseen
87     */
88    public Iterator iterator() {
89      return alkiot.iterator();
90    }
91  
92    /**
93     * Iteraattori, jolla käydään lävitse tietyn henkilön harrastukset.
94     * @author Vesa Lappalainen
95     * @version 1.0, 20.03.2003
96     */
97    public class HarrastuksetIterator implements Iterator {
98      private int jasenid;
99      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 
193