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