001    package kerho;
002    import java.io.*;
003    import java.util.*;
004    import fi.jyu.mit.ohj2.*;
005    /**
006     * Kerhon jäsenistö joka osaa mm. lisätä uuden jäsenen
007     *
008     * @author Vesa Lappalainen
009     * @version 1.0, 22.02.2003
010     * @version 1.1, 20.03.2003
011     */
012    public class Jasenet {
013      private static final int MAX_JASENIA = 25;
014      private int lkm = 0;
015      private boolean muutettu = false;
016      private String nimi = "";
017      private String koko_nimi = "";
018      private Jasen alkiot[] = new Jasen[MAX_JASENIA];
019    
020      public Jasenet() {  }
021    
022      /**
023       * Lisää uuden jäsenen tietorakenteeseen.  Ottaa jäsenen omistukseensa.
024       * @param jasen lisätäävän jäsnen viite.  Huom tietorakenne muuttuu omistajaksi
025       * @throws SailoException jos tietorakennen on jo täynnä
026       */
027      public void lisaa(Jasen jasen) throws SailoException {
028        muutettu = true;
029        if ( lkm >= alkiot.length ) throw new SailoException("Liikaa alkioita");
030        alkiot[lkm] = jasen;
031        lkm++;
032      }
033    
034    
035      /**
036       * Palauttaa viitteen i:teen jäseneen.
037       * @param i monennenko jäsenen viite halutaan
038       * @return viite jäseneen, jonka indeksi on i
039       * @throws SailoException jos i ei ole sallitulla alueella
040       */
041      public Jasen anna(int i) throws SailoException {
042        if ( i < 0 || lkm <= i ) throw new SailoException("Laiton indeksi " + i);
043        return alkiot[i];
044      }
045    
046    
047    
048    
049    
050      /**
051       * Lukee jäsenistön tiedostosta.  Kesken.
052       * @param tied tiedoston nimen alkuosa
053       * @throws SailoException jos lukeminen epäonnistuu
054       */
055      public void lue_tiedostosta(String tied) throws SailoException {
056        nimi = tied;
057        BufferedReader fi = Tiedosto.avaa_lukemista_varten(getTiedoston_nimi());
058        if ( fi == null ) throw new SailoException("Tiedosto " + getTiedoston_nimi() + " ei aukea");
059    
060        try {
061          koko_nimi = fi.readLine();
062          if ( koko_nimi == null ) throw new SailoException("xxxxx");
063          String rivi = fi.readLine();
064          if ( rivi == null ) throw new SailoException("xxxxx");
065          int max_koko = Mjonot.erotaInt(rivi,10); // tehdään jotakin
066    
067          while ( ( rivi = fi.readLine() ) != null ) {
068            rivi = rivi.trim();
069            if ( rivi.equals("") || rivi.startsWith(";") ) continue;
070            Jasen jasen = new Jasen();
071            jasen.parse(rivi);  // voisi olla virhekäsittely
072            lisaa(jasen);
073          }
074          muutettu = false;
075    
076    
077        } catch ( IOException e ) {
078    
079    
080        } finally {
081          try {
082            fi.close();
083          } catch (IOException ex) {
084          }
085        }
086      }
087    
088      /**
089       * Tallentaa jäsenistön tiedostoon.  Kesken.
090       * Tiedoston muoto:
091       * <pre>
092       * Kelmien kerho
093       * 20
094       * ; kommenttirivi
095       * 2|Ankka Aku|121103-706Y|Ankkakuja 6|12345|ANKKALINNA|12-1234|||1996|50.0|30.0|Velkaa Roopelle
096       * 3|Ankka Tupu|121153-706Y|Ankkakuja 6|12345|ANKKALINNA|12-1234|||1996|50.0|30.0|Velkaa Roopelle
097       * </pre>
098       * @throws SailoException jos talletus epäonnistuu
099       */
100      public void talleta() throws SailoException {
101        if ( !muutettu ) return;
102    
103        File fbak = new File(getBak_nimi());
104        File ftied = new File(getTiedoston_nimi());
105        if ( !fbak.delete() )         ; //System.err.println("Ei voi tuhota");
106        if ( !ftied.renameTo(fbak) )  ; //System.err.println("Ei voi nimetä");
107    
108        PrintWriter fo = Tiedosto.avaa_kirjoittamista_varten(ftied.getName());
109        if ( fo == null )
110          throw new SailoException("Tiedosto " + ftied.getName() + "ei aukea");
111        try {
112          fo.println(getKoko_nimi());
113          fo.println(alkiot.length);
114          for (Iterator i=iterator(); i.hasNext(); ) {
115            Jasen jasen = (Jasen)i.next();
116            fo.println(jasen.toString());
117          }
118    //    } catch ( IOException e ) {
119        } finally {
120          fo.close();
121        }
122    
123        muutettu = false;
124      }
125    
126      /**
127       * Palauttaa Kerhon koko nimen
128       * @return Kerhon koko nimi merkkijononna
129       */
130      public String getKoko_nimi()           { return koko_nimi;                   }
131    
132      /**
133       * Palauttaa kerhon jäsenten lukumäärän
134       * @return jäsenten lukumäärä
135       */
136      public int getLkm()                    { return lkm;                         }
137    
138      /**
139       * Palauttaa tiedoston nimen, jota käytetään tallennukseen
140       * @return tallennustiedoston nimi
141       */
142      public String getTiedoston_nimi()      { return nimi + ".dat";               }
143    
144      /**
145       * Palauttaa varakopiotiedoston nimen
146       * @return varakopiotiedoston nimi
147       */
148      public String getBak_nimi()            { return nimi + ".bak";               }
149    
150      /**
151       * Iteraattorin implementointi.
152       * @author Vesa Lappalainen
153       * @version 1.0, 20.03.2003
154       */
155      public class JasenetIterator implements Iterator {
156        private int kohdalla = -1;
157    
158        public boolean hasNext() {
159    //     if ( kohdalla + 1 >= lkm )  return false;
160    //     return true;
161          return kohdalla + 1 < lkm;
162        }
163    
164        public Object next() throws NoSuchElementException {
165          if ( !hasNext() ) throw new NoSuchElementException("Ei oo");
166          kohdalla++;
167          return alkiot[kohdalla];
168        }
169    
170        public void remove() throws UnsupportedOperationException {
171          throw new UnsupportedOperationException("Me ei poisteta");
172        }
173      }
174    
175      /**
176       * Palauttaa iteraattorin jolla kaikki jäsenet voidaan käydä lävitse
177       * @return iteraattori kaikkien läpikäymiseen
178       */
179      public Iterator iterator() {
180        return new JasenetIterator();
181      }
182    
183      public class Vertailija implements Comparator {
184        int k;
185        public Vertailija(int k) { this.k = k; }
186    
187        public int compare(Object o1, Object o2) {
188          Jasen j1 = (Jasen)o1;
189          Jasen j2 = (Jasen)o2;
190    
191          String s1 = j1.getAvain(k);
192          String s2 = j2.getAvain(k);
193    
194          return s1.compareTo(s2);
195    
196        }
197    
198      }
199    
200      public List etsi(int k, String hakuehto) {
201        List loytyneet = new ArrayList();
202    
203        for (Iterator i = iterator(); i.hasNext(); ) {
204          Jasen jasen = (Jasen)i.next();
205          String kentta = jasen.anna(k);
206          if ( WildChars.onkoSamat(kentta,hakuehto) )
207            loytyneet.add(jasen);
208        }
209    
210        Collections.sort(loytyneet,new Vertailija(k));
211        return loytyneet;
212      }
213    
214      /**
215       * Etsii jäsenen id:n perusteella
216       * @param id tunnusnumero, jonka mukaan etsitään
217       * @return jäsen jolla etsittävä id tai null
218       */
219      public Jasen annaId(int id) {
220        for (Iterator i = iterator(); i.hasNext(); ) {
221          Jasen jasen = (Jasen)i.next();
222          if ( id == jasen.getTunnus_nro() ) return jasen;
223        }
224        return null;
225    
226      }
227    
228    
229      /**
230       * Testiohjelma jäsenistölle
231       * @param args ei käytössä
232       */
233      public static void main(String args[]) {
234        Jasenet jasenet = new Jasenet();
235        try {
236          jasenet.lue_tiedostosta("kelmit");
237        } catch ( SailoException ex ) {
238          System.out.println("Virhe: " + ex.getMessage());
239        }
240    
241        Jasen aku = new Jasen(), aku2 = new Jasen();
242        aku.rekisteroi();    aku.vastaa_aku_ankka();
243        aku2.rekisteroi();   aku2.vastaa_aku_ankka();
244    
245        try {
246          jasenet.lisaa(aku);
247          jasenet.lisaa(aku2);
248    
249          System.out.println("============= Jäsenet testi =================");
250    
251    //      for (int i=0; i<jasenet.getLkm(); i++) {
252          for (Iterator  i=jasenet.iterator(); i.hasNext(); ) {
253    //        Jasen jasen = jasenet.anna(i);
254            Jasen jasen = (Jasen)i.next();
255            System.out.println("Jäsen nro: " + jasen.getTunnus_nro());
256            jasen.tulosta(System.out);
257          }
258    
259        } catch ( SailoException ex ) {
260          System.out.println(ex.getMessage());
261        }
262    
263        try {
264          jasenet.talleta();
265        } catch ( SailoException e ) {
266          System.out.println("Virhe: " + e.getMessage());
267        }
268    
269      }
270    
271    }
272    
273