CharacterRange.java
001 package gate.creole.morph;
002 
003 import java.util.Arrays;
004 
005 /**
006  <p>Title: </p>
007  <p>Description: </p>
008  <p>Copyright: Copyright (c) 2003</p>
009  <p>Company: </p>
010  @author not attributable
011  @version 1.0
012  */
013 
014 public class CharacterRange extends Variable {
015 
016   private char [] varChars;
017 
018   /**
019    * Constructor
020    */
021   public CharacterRange() {
022 
023   }
024 
025   /**
026    * Tells if any value available which can be retrieved
027    @return true if value available, false otherwise
028    */
029   @Override
030   public boolean hasNext() {
031     if(pointer<varChars.length) {
032       return true;
033     else {
034       return false;
035     }
036   }
037 
038   /**
039    * Returns the next available value for this variable
040    @return value of the variable in the String format
041    */
042   @Override
043   public String next() {
044     if(pointer<varChars.length) {
045       pointer++;
046       return ""+varChars[pointer-1];
047     else {
048       return null;
049     }
050   }
051 
052 
053   /**
054    * Process the provided value and stores in the underlying data structure
055    @param varName name of the variable
056    @param varValue String that contains possible different values
057    @return true if successfully stored, false otherwise
058    */
059   @Override
060   public boolean set(String varName, String varValue) {
061     this.varName = varName;
062     this.varValue = varValue.trim();
063     // lets process the varValue
064     // remove the [- and ] from the varValue
065     varValue = varValue.substring(2,varValue.length()-1);
066     // we need to find the sets
067     String characters = "";
068     for(int i=0; i<varValue.length();i = i + 3) {
069       String set = varValue.substring(i,i+3);
070       char startWith = set.charAt(0);
071       char endWith = set.charAt(2);
072       if(startWith>endWith) {
073         char temp = startWith;
074         startWith = endWith;
075         endWith = temp;
076       }
077       for(int j=startWith;j<=endWith;j++) {
078         // if it is already present no need to add it
079         if(characters.indexOf((char)j)<0) {
080           characters = characters + (char)(j);
081         }
082       }
083     }
084     // convert it into the character array and sort it
085     this.varChars = characters.toCharArray();
086     Arrays.sort(this.varChars);
087 
088     // now we need to convert the varValue into the proper pattern
089     // simply remove the second character (i.e. '-')
090     this.varValue = new String(new StringBuffer(this.varValue).deleteCharAt(1));
091     return true;
092   }
093 
094   /**
095    * A method that tells if the characters of the provided value are
096    * from the character range only
097    @param value String of which the characters to be searched in the
098    * character range
099    @return true if all characters of value string are from the
100    * specified character range, false otherwise
101    */
102   @Override
103   public boolean contains(String value) {
104     for(int i=0;i<value.length();i++) {
105       if(Arrays.binarySearch(this.varChars,value.charAt(i))<0) {
106         return false;
107       }
108     }
109     return true;
110   }
111 
112 }