1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
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
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 }