View Javadoc

1   /*
2   * The contents of this file are subject to the BT "ZEUS" Open Source 
3   * Licence (L77741), Version 1.0 (the "Licence"); you may not use this file 
4   * except in compliance with the Licence. You may obtain a copy of the Licence
5   * from $ZEUS_INSTALL/licence.html or alternatively from
6   * http://www.labs.bt.com/projects/agents/zeus/licence.htm
7   * 
8   * Except as stated in Clause 7 of the Licence, software distributed under the
9   * Licence is distributed WITHOUT WARRANTY OF ANY KIND, either express or 
10  * implied. See the Licence for the specific language governing rights and 
11  * limitations under the Licence.
12  * 
13  * The Original Code is within the package zeus.*.
14  * The Initial Developer of the Original Code is British Telecommunications
15  * public limited company, whose registered office is at 81 Newgate Street, 
16  * London, EC1A 7AJ, England. Portions created by British Telecommunications 
17  * public limited company are Copyright 1996-9. All Rights Reserved.
18  * 
19  * THIS NOTICE MUST BE INCLUDED ON ANY COPY OF THIS FILE
20  */
21  
22  
23  
24  package zeus.generator.task.rulebase;
25  
26  import javax.swing.table.*;
27  import java.util.*;
28  import javax.swing.JOptionPane;
29  import javax.swing.event.*;
30  import zeus.concepts.*;
31  
32  
33  public class RuleModel  extends AbstractTableModel implements ChangeListener{
34  
35        static final int RULE     = 0;
36        static final int PRIORITY = 1;
37        static final String[]  header = { "Rule", "Priority"};
38  
39        Vector rules;
40        OntologyDb ontology;
41        static int RULE_COUNT = 0;
42        protected EventListenerList changeListeners = new EventListenerList();
43  //---------------------------------------------------------------------------
44        public RuleModel(ReteKB kb, OntologyDb db) {
45           rules = new Vector();
46           ontology = db;
47  	 zeus.rete.Rule[] reteRules = kb.getRules();
48           for(int i = 0; i< reteRules.length; i++)
49              addRule(reteRules[i]);
50        }
51  
52  //---------------------------------------------------------------------------
53         public int     getRowCount()                    { return rules.size(); }
54         public int     getColumnCount()                 { return header.length; }
55         public String  getColumnName(int col)           { return header[col]; }
56         public boolean isCellEditable(int row, int col) { return true; }
57  
58  //----------------------------------------------------------------------------
59         public Object getValueAt(int row, int col) {
60            Rule rule = (Rule) rules.elementAt(row);
61            switch(col) {
62               case RULE:
63                    return rule.getName();
64               case PRIORITY:
65                    return new Integer(rule.getPriority());
66            }
67            return null;
68         }
69  //----------------------------------------------------------------------------
70         public void setValueAt(Object aValue, int row, int column) {
71             Rule rule = (Rule) rules.elementAt(row);
72            switch(column) {
73               case RULE:
74                    String name =(String)aValue;
75                    if ( name.equals(rule.getName()) ) return;
76                    rule.setName(name);
77                    break;
78               case PRIORITY:
79                    int p = Integer.parseInt((String)aValue);
80                    if ( p == rule.getPriority() ) return;
81                    rule.setPriority(p);
82                    break;
83            }
84            fireChanged();
85         }
86  //----------------------------------------------------------------------------
87         public void addRule(zeus.rete.Rule reteRule) {
88             String name = reteRule.getName();
89             int priority = reteRule.getSalience();
90             Rule rule = new Rule(name,priority);
91             rule.setPatterns(reteRule.getPatterns());
92             rule.setActions(reteRule.getActions());
93             rule.addChangeListener(this);
94             rules.addElement(rule);
95             fireTableDataChanged();
96             fireChanged();
97         }
98  //--------------------------------------------------------------------------
99         public zeus.rete.Rule[] getData() {
100           zeus.rete.Rule reteRule = null;
101           Rule rule = null;
102           Vector actions = null;
103           Vector patterns = null;
104           zeus.rete.Rule[]reteRules = new zeus.rete.Rule[rules.size()];
105 
106           for(int i = 0; i< rules.size(); i++ ) {
107              rule = (Rule) rules.elementAt(i);
108              reteRule = new zeus.rete.Rule(rule.getName(),rule.getPriority());
109              try {
110                 patterns = ZeusParser.retePatternList(ontology,rule.getPatterns());
111                 addPatterns(reteRule,patterns);
112                 actions = ZeusParser.reteActionList(ontology,rule.getActions());
113                 addActions(reteRule,actions);
114              }
115              catch(Exception e) {
116                 JOptionPane.showMessageDialog(null,"Syntax error parsing rule \'" +
117                    rule.getName() + "\'", "Syntax Error", JOptionPane.ERROR_MESSAGE);
118              }
119              reteRules[i] = reteRule;
120           }
121          return reteRules;
122        }
123 //--------------------------------------------------------------------------
124        private void addActions(zeus.rete.Rule reteRule, Vector actions) {
125            zeus.rete.Action action = null;
126 
127            for(int i=0; i<actions.size();i++) {
128               action = (zeus.rete.Action) actions.elementAt(i);
129 	      reteRule.addAction(action);
130            }
131        }
132 //--------------------------------------------------------------------------
133        private void addPatterns(zeus.rete.Rule reteRule, Vector patterns) {
134            zeus.rete.Pattern pattern = null;
135 
136            for(int i=0; i<patterns.size();i++) {
137               pattern = (zeus.rete.Pattern) patterns.elementAt(i);
138 	      reteRule.addPattern(pattern);
139            }
140        }
141 //--------------------------------------------------------------------------
142        public void addRule() {
143            String name = "Rule" + (RULE_COUNT++);
144            while( existRuleName(name) )
145               name = "Rule" + (RULE_COUNT++);
146 
147            Rule rule = new Rule(name,zeus.rete.Rule.NORM_SALIENCE);
148            rule.addChangeListener(this);
149            rules.addElement(rule);
150            fireTableDataChanged();
151            fireChanged();
152 //           System.out.println("added " + RULE_COUNT);
153 
154        }
155 //----------------------------------------------------------------------------
156        public void deleteRule(int row) {
157           Rule rule = (Rule) rules.elementAt(row);
158           rules.removeElementAt(row);
159           rule.removeChangeListener(this);
160           fireTableDataChanged();
161           fireChanged();
162        }
163 //---------------------------------------------------------------------------
164        private boolean existRuleName(String name) {
165           Rule rule;
166 
167           for(int i = 0; i < rules.size(); i++) {
168              rule = (Rule) rules.elementAt(i);
169              if (rule.getName().equals(name))
170                 return true;
171           }
172          return false;
173        }
174 //---------------------------------------------------------------------------
175        public Rule getRule(int row) {
176             Rule rule = (Rule) rules.elementAt(row);
177 //            System.out.println("getRule " + row);
178             return rule;
179        }
180 //---------------------------------------------------------------------------
181        public Vector getRules() {
182          return rules;
183        }
184 //----------------------------------------------------------------------------
185     public void addChangeListener(ChangeListener x) {
186       changeListeners.add(ChangeListener.class, x);
187     }
188 //----------------------------------------------------------------------------
189     public void removeChangeListener(ChangeListener x) {
190       changeListeners.remove(ChangeListener.class, x);
191     }
192 //----------------------------------------------------------------------------
193      protected void fireChanged() {
194       ChangeEvent c = new ChangeEvent(this);
195       Object[] listeners = changeListeners.getListenerList();
196       for(int i= listeners.length-2; i >= 0; i -=2) {
197          if (listeners[i] == ChangeListener.class) {
198             ChangeListener cl = (ChangeListener)listeners[i+1];
199             cl.stateChanged(c);
200          }
201       }
202      }
203 //---------------------------------------------------------------------------
204      public void stateChanged(ChangeEvent e) {
205          fireChanged();
206      }
207 }