PrioritisedRuleList.java
001 /*
002  *  PrioritisedRuleList.java - transducer class
003  *
004  *  Copyright (c) 1995-2012, The University of Sheffield. See the file
005  *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
006  *
007  *  This file is part of GATE (see http://gate.ac.uk/), and is free
008  *  software, licenced under the GNU Library General Public License,
009  *  Version 2, June 1991 (in the distribution as file licence.html,
010  *  and also available at http://gate.ac.uk/gate/licence.html).
011  *
012  *  Hamish Cunningham, 27/07/98
013  *
014  *  $Id: PrioritisedRuleList.java 17595 2014-03-08 13:05:32Z markagreenwood $
015  */
016 
017 
018 package gate.jape;
019 
020 import java.util.ArrayList;
021 import java.util.Iterator;
022 
023 
024 /**
025   * A list of rules ordered according to priority. May be used for ordering
026   * non-matched rules (in which case the order is based on
027   * priority/position), or matched rules (in which case the order is based
028   * on matched lenght/priority/position). Note that position represents
029   * the idea of order within an input file; it is assumed that this is the
030   * same as the order of addition of the rules to the list, i.e. a rule
031   * added 5th is assumed to occupy 5th place in the file (or other rule
032   * source). This class is based on JGL's DList, which allows for fast
033   * insertion of elements at any point. The highest priority rule is the
034   * first in the list, which may be accessed by <CODE>front()</CODE>.
035   */
036 public class PrioritisedRuleList extends ArrayList<Rule> implements java.io.Serializable
037 {
038   private static final long serialVersionUID = 1603854971047597460L;
039 
040   /** Adds a rule in order. Used for non-matched rules. Implements the
041     * ordering based on priority/position.
042     */
043   public synchronized boolean add(Rule newRule) {
044     /* for each rule,
045      *   if it is higher priority, continue;
046      *   else if it is same priority
047      *     if it is higher position, continue;
048      *     else break
049      *   else (it is lower priority) break
050      * insert newRule before current position (which may be finish)
051      */
052     Iterator<Rule> iterator = this.iterator();
053     int i = 0;
054     for(  ; iterator.hasNext(); i++) {
055       Rule rule  =  iterator.next();
056       int rulePriority =  rule.getPriority();
057       int newRulePriority =  newRule.getPriority();
058       int rulePosition =  rule.getPosition();
059       int newRulePosition =  newRule.getPosition();
060 
061       if(rulePriority > newRulePriority)
062         continue;
063       else if(rulePriority == newRulePriority) {
064         if(rulePosition < newRulePosition)
065           continue;
066         else
067           break;
068       else {
069         break;
070       }
071 
072     // while not hit the end of the rules
073 
074 
075     this.add(i, newRule);
076     
077     return true;
078   // add(Rule)
079 
080 
081 // class PrioritisedRuleList
082 
083 
084 // $Log$
085 // Revision 1.8  2005/01/11 13:51:36  ian
086 // Updating copyrights to 1998-2005 in preparation for v3.0
087 //
088 // Revision 1.7  2004/07/21 17:10:08  akshay
089 // Changed copyright from 1998-2001 to 1998-2004
090 //
091 // Revision 1.6  2004/03/25 13:01:13  valyt
092 // Imports optimisation throughout the Java sources
093 // (to get rid of annoying warnings in Eclipse)
094 //
095 // Revision 1.5  2001/09/13 12:09:50  kalina
096 // Removed completely the use of jgl.objectspace.Array and such.
097 // Instead all sources now use the new Collections, typically ArrayList.
098 // I ran the tests and I ran some documents and compared with keys.
099 // JAPE seems to work well (that's where it all was). If there are problems
100 // maybe look at those new structures first.
101 //
102 // Revision 1.4  2000/11/08 16:35:03  hamish
103 // formatting
104 //
105 // Revision 1.3  2000/10/16 16:44:34  oana
106 // Changed the comment of DEBUG variable
107 //
108 // Revision 1.2  2000/10/10 15:36:36  oana
109 // Changed System.out in Out and System.err in Err;
110 // Added the DEBUG variable seted on false;
111 // Added in the header the licence;
112 //
113 // Revision 1.1  2000/02/23 13:46:10  hamish
114 // added
115 //
116 // Revision 1.1.1.1  1999/02/03 16:23:02  hamish
117 // added gate2
118 //
119 // Revision 1.6  1998/10/01 16:06:34  hamish
120 // new appelt transduction style, replacing buggy version
121 //
122 // Revision 1.5  1998/09/17 10:24:02  hamish
123 // added options support, and Appelt-style rule application
124 //
125 // Revision 1.4  1998/08/12 19:05:47  hamish
126 // fixed multi-part CG bug; set reset to real reset and fixed multi-doc bug
127 //
128 // Revision 1.3  1998/07/30 11:05:24  mks
129 // more jape
130 //
131 // Revision 1.2  1998/07/29 11:07:08  hamish
132 // first compiling version
133 //
134 // Revision 1.1.1.1  1998/07/28 16:37:46  hamish
135 // gate2 lives