001    /***************************************************************************************************
002     *               MODULE DESCRIPTION
003     ****************************************************************************************************
004     *
005     *               NAME:           INSERT_FILE_NAME.java
006     *               LANGUAGE:       Java2
007     *               DATE:           INSERT_DATE
008     *               AUTHOR:         INSERT_AUTHOR, Jyväskylän yliopisto
009     *
010     ****************************************************************************************************
011     *               COPYRIGHT (C) KIURU-PROJEKTIRYHMÄ
012     *               Limited rights granted. Please refer to license
013     ****************************************************************************************************
014     *  
015     ****************************************************************************************************
016     *               UPDATES
017     ****************************************************************************************************
018     *
019     *   5.12.2002 Initial release
020     *
021     ****************************************************************************************************/
022    package kiurubeans;
023    import java.util.StringTokenizer;
024    /**
025     * A String tokenizer-like class that supports phrases. Delimiters inside
026     * phrases are ignored.
027     *
028     * @author Miika Nurminen
029     */
030    public class PhraseStringTokenizer implements java.util.Enumeration {
031    // Attributes
032      /** Remaining String to parse*/
033      private StringTokenizer st = null;
034      /** Phrase delimiters */
035      private String phraseDelim = null;
036      /** Token delimiters */
037      private String delim = null;
038      
039    // Constructors
040    
041      /**
042       * Creates a new instance of PhraseStringTokenizer
043       *
044       * @param str String to parse
045       * @param delim Delimiters used
046       * @param phraseDelim Phrase delimiters used
047       */  
048      public PhraseStringTokenizer(String str, String delim, String phraseDelim) {
049        if (KiuruString.anyCharIndexOf(delim,phraseDelim)!=-1) throw 
050          new IllegalArgumentException("Delims and phrasedelims must be separate!");     
051        st = new StringTokenizer(str,delim+phraseDelim,true);
052        this.phraseDelim = phraseDelim;
053        this.delim = delim;
054      }
055      
056      /** Tests if this enumeration contains more elements.
057       *
058       * @return  <code>true</code> if and only if this enumeration object
059       *           contains at least one more element to provide;
060       *          <code>false</code> otherwise.
061       *
062       */
063      public boolean hasMoreElements() {
064        return st.hasMoreElements();
065      }
066      
067      /** Returns the next element of this enumeration if this enumeration
068       * object has at least one more element to provide.
069       * For example: Let input = a|b|"c"|d
070       * Returns<br/>
071       *  a<br/>
072       *  b<br/>
073       *  "c"<br/>
074       *  d<br/>
075       * @return     the next element of this enumeration.
076       */
077      public Object nextElement() {
078        return nextToken();
079      }
080      
081      /** Returns the next element of this enumeration if this enumeration
082       * object has at least one more element to provide.
083       * For example: Let input = a|b|"c"|d
084       * Returns<br/>
085       *  a<br/>
086       *  b<br/>
087       *  "c"<br/>
088       *  d<br/>
089       * @return     the next element of this enumeration.
090       */
091      public String nextToken() {
092        boolean phrasestate = false;
093        StringBuffer result = new StringBuffer(10);
094        String s = null;
095        do {
096          do {
097            if (st.hasMoreTokens()==false) return result.toString();
098            s = st.nextToken();
099          } while ( (KiuruString.anyCharIndexOf(s, delim)!=-1) && (phrasestate==false) );
100          
101          result.append(s);
102          if (KiuruString.anyCharIndexOf(s, phraseDelim)!=-1) {
103            if (phrasestate) return result.toString();
104            else phrasestate=true;
105          }
106        } while ((phrasestate==true) || (st.hasMoreTokens()==false));
107        return result.toString();
108      }
109      
110      
111      /**
112       * Unit test.
113       * @param args command line arguments (not used).
114       */
115      public static void main(String[] args) {
116        String[] t = {"Test \"another ffdsf\" fdsf |dsfds",
117                      "\"test\",fjdslfkjsda ,  , \",fdsf,fds fd\"fdsfds\" dfg",
118          "  'test' , fjdslfkjsda ,  , \",fdsf,fds fd\"fdsfds  "};
119        for (int i=0; i<t.length; i++) {
120          PhraseStringTokenizer p = new PhraseStringTokenizer(t[i],", ","\"'");
121          System.out.println(t[i]);
122          while (p.hasMoreElements()) {
123            System.out.println(p.nextElement()+"<<");
124          }
125          System.out.println("<end>");
126        }
127        for (int i=0; i<t.length; i++) {
128          PhraseStringTokenizer p = new PhraseStringTokenizer(t[i],", ","");
129          System.out.println(t[i]);
130          while (p.hasMoreElements()) {
131            System.out.println(p.nextElement());
132          }
133          System.out.println("<end>");
134        }
135        for (int i=0; i<t.length; i++) {
136          PhraseStringTokenizer p = new PhraseStringTokenizer(t[i],"","\"");
137          System.out.println(t[i]);
138          while (p.hasMoreElements()) {
139            System.out.println(p.nextElement());
140          }
141          System.out.println("<end>");
142        }
143      }
144    }
145    /***************************************************************************************************
146     *               COPYRIGHT (C) KIURU-PROJEKTIRYHMÄ
147     *               Limited rights granted. Please refer to license
148     ****************************************************************************************************/