1   /*
2    *  FSMState.java
3    *
4    *  Copyright (c) 1998-2005, The University of Sheffield.
5    *
6    *  This file is part of GATE (see http://gate.ac.uk/), and is free
7    *  software, licenced under the GNU Library General Public License,
8    *  Version 2, June 1991 (in the distribution as file licence.html,
9    *  and also available at http://gate.ac.uk/gate/licence.html).
10   *
11   *  Valentin Tablan, 11/07/2000
12   *
13   *  $Id: FSMState.java,v 1.12 2006/03/22 11:21:38 valyt Exp $
14   */
15  
16  package gate.creole.gazetteer;
17  
18  import java.io.Serializable;
19  import java.util.HashSet;
20  import java.util.Set;
21  import gate.creole.gazetteer.DefaultGazetteer.CharMap;
22  
23  /** Implements a state of the deterministic finite state machine of the
24   * gazetter.
25   *
26   */
27  public class FSMState implements Serializable {
28  
29    /** Debug flag
30     */
31    private static final boolean DEBUG = false;
32  
33    /** Constructs a new FSMState object and adds it to the list of
34     * states of the {@link DefaultGazetteer} provided as owner.
35     *
36     * @param owner a {@link DefaultGazetteer} object
37     */
38    public FSMState(DefaultGazetteer owner) {
39      myIndex = index++;
40      owner.fsmStates.add(this);
41    }
42  
43    /** Adds a new value to the transition function
44     */
45  // >>> DAM: was - to use CharMap
46  /*
47    void put(Character chr, FSMState state) {
48      transitionFunction.put(chr,state);
49    }
50  */
51  // >>> DAM: TransArray optimization
52    public void put(char chr, FSMState state) {
53      transitionFunction.put(chr,state);
54    }
55  // >>> DAM: end
56  
57    /** This method is used to access the transition function of this state.
58     */
59  // >>> DAM: was
60  /*
61    FSMState next(Character chr) {//UnicodeType type){
62      return (FSMState)transitionFunction.get(chr);
63    }
64    */
65  // >>> DAM: TransArray optimization
66    public FSMState next(char chr) {//UnicodeType type){
67      return (FSMState)transitionFunction.get(chr);
68    }
69  // >>> DAM: end
70  
71    /** Returns a GML (Graph Modelling Language) representation of the edges
72     * emerging from this state.
73     */
74  //<<< DAM: was - to use new char Iter returned by the CharMap iteratior
75  /*
76    String getEdgesGML() {
77      String res = "";
78      Iterator charsIter = transitionFunction.keySet().iterator();
79      Character currentChar;
80      FSMState nextState;
81  
82      while(charsIter.hasNext()){
83        currentChar = (Character)charsIter.next();
84        nextState = next(currentChar);
85        res += "edge [ source " + myIndex +
86        " target " + nextState.getIndex() +
87        " label \"'" + currentChar + "'\" ]\n";
88      }
89  */
90  // DAM, TransArray optimization
91    public String getEdgesGML() {
92      String res = "";
93      char currentChar;
94      FSMState nextState;
95  
96      for (int i = 0; i < transitionFunction.itemsKeys.length; i++)
97      {
98        currentChar = transitionFunction.itemsKeys[i];
99        nextState = next(currentChar);
100       res += "edge [ source " + myIndex +
101       " target " + nextState.getIndex() +
102       " label \"'" + currentChar + "'\" ]\n";
103     }
104 // >>> DAM, end
105     return res;
106   }
107 
108   /** Checks whether this state is a final one
109    */
110   public boolean isFinal() {
111 // >>> was
112 //    return !lookupSet.isEmpty();
113 // >>> BOBI, Lookup opitimization
114     if (lookupSet==null)
115         return false;
116     return !lookupSet.isEmpty();
117 // >>> end
118   }
119 
120   /** Returns a set of {@link Lookup} objects describing the types of lookups
121    * the phrase for which this state is the final one belongs to
122    */
123   public Set getLookupSet(){return lookupSet;}
124 
125   /** Adds a new looup description to this state's lookup descriptions set
126    */
127   public void addLookup(Lookup lookup) {
128 // >>> was nothing
129 // >>> BOBI, Lookup opitimization
130     if (lookupSet == null)
131         lookupSet = new HashSet(4);
132 // >>> end
133 
134     lookupSet.add(lookup);
135   } // addLookup
136 
137   /** Removes a looup description from this state's lookup descriptions set
138    */
139   public void removeLookup(Lookup lookup) {
140     lookupSet.remove(lookup);
141   } // removeLookup
142 
143   /** Returns the unique ID of this state.
144    */
145   public int getIndex(){ return myIndex; }
146 
147 
148   /** The transition function of this state.
149    */
150 // >>> was
151 //  Map transitionFunction = new HashMap();
152 // >>> NASO, hash4 optimization
153 //  Map transitionFunction = new HashMap(4);
154 // >>> DAM, TransArray
155   protected CharMap transitionFunction = new CharMap();
156 // >>> end
157 
158   /**    *
159    */
160 // >>> was
161 //  Set lookupSet = new HashSet();
162 // >>> NASO, hash4 optimization
163 //  Set lookupSet = new HashSet(4);
164 // >>> BOBI, Lookup opitimization
165   protected Set lookupSet;
166 // >>> end
167 
168   /**
169    * The unique id of this state. This value is never used by the algorithms but
170    * it can be useful for graphical representations.
171    */
172   protected int myIndex;
173 
174   /**
175    * Class member used to generate unique ids for the instances
176    *
177    */
178   private static int index;
179 
180   static{
181     index = 0;
182   }
183 
184 } // class FSMState
185