1   import fi.jyu.mit.ohj2.Mjonot; // erota-funktio
2   
3   /**
4    * Hakuluokka merkkijonon hakuun korkeintaan yhdellä jokerimerkillä annetusta
5    * hakuehdosta
6    * @author Miika Nurminen
7    * @version 0.1 19.3.2003
8    */
9   public class JokeriHakija implements SanaHakija {
10    private String ehto = null;
11    private String alku = null;
12    private String loppu = null;
13    private boolean jokeri = false;
14    
15    /** 
16     * Luo uuden JokeriHakijan ja alustaa hakuehdon
17     * @param ehto hakuehto
18     */
19    public JokeriHakija(String ehto) {
20      alusta(ehto);
21    }
22    
23    /** 
24     * Alustaa hakijan määärätylle hakuehdolle. Tarkistaa ehdon järkevyyden
25     * @param ehto Hakuehto
26     */
27    public void alusta(String ehto) {
28      if (ehto!=null){
29        int i = ehto.indexOf('*');
30        if ( (ehto.indexOf(' ')!=-1) || (i!=ehto.lastIndexOf('*')) )
31          throw new IllegalArgumentException("Virheellinen hakuehto!");
32        StringBuffer sb = new StringBuffer(ehto);
33        this.alku = Mjonot.erota(sb,'*');
34        this.loppu = sb.toString();
35        this.jokeri = (i!=-1);
36      }
37      this.ehto = ehto;
38    }
39    
40    /** 
41     * Tutkii, täsmääkö sana edellä alustetun hakuehdon kanssa
42     * @param sana Sana, johon hakuehtoa sovelletaan
43     * @return jos sana täsmää hakuehtoon, palauttaa true:n
44     */
45    public boolean hae(String sana) {
46      if (this.ehto==null) return true;
47      if (sana.length()<this.alku.length()+this.loppu.length()) return false;
48      if (sana.indexOf(this.alku)!=0) return false;
49      if ((!jokeri) && (sana.length()>this.alku.length())) return false;
50      if (sana.lastIndexOf(this.loppu)!=sana.length()-this.loppu.length()) return false;
51      return true;
52    }
53    
54    /**
55     * Palauttaa hakuehton merkkijonona
56     * @return hakuehto merkkijonona
57     */
58    public String toString() {
59      return this.ehto;
60    }
61  }
62