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.actors;
25  
26  import zeus.actors.event.*; 
27  import java.util.*;
28  import zeus.util.*;
29  import zeus.concepts.*;
30  import java.lang.reflect.*; 
31  
32  public class ActionNode extends MsgNode {
33     String rule = null;
34     MessageAction action = null;
35  
36  // meaningless init  to allow rearch
37     public ActionNode() {
38     ;
39     }
40  
41  
42     ActionNode(MsgHandler engine, String rule, MessageAction action) {
43        super(engine);
44        this.rule = rule;
45        this.action = action;
46     }
47     
48     void evaluate(String rule, Performative input) {
49         if ( action.getType() == MessageActionImpl.EXECUTE_ONCE )
50            engine.removeRule(rule);
51     //   System.out.println("in evalate in exec " + rule +" " + action.getMethod()); 
52         execRule(rule,action.getObject(),action.getMethod(),input);
53     }
54     
55     
56     public String toString() {
57        return "ActionNode(" + rule + "," + action + ")";
58     }
59     
60     
61     public final synchronized Object execRule(String rule, Object object, String method, Performative input) {
62  
63        Class c = object.getClass();
64        try {
65           Class[] parameter_types = new Class[1];
66           parameter_types[0] = input.getClass();
67  	     Object[] arglist = new Object[1];
68           arglist[0] = input;
69  
70           Core.DEBUG(2,"Invoking method " + method + " of class " +
71                      c.getName() + " with parameter " + input);
72  
73           Method m = c.getMethod(method,parameter_types);
74           engine.notifyMonitors(MsgHandler.FIRE,new MessageHandlerEvent(this,rule,object,method,input,MessageHandlerEvent.FIRE_MASK));
75           return m.invoke(object,arglist);
76        }
77        catch(Throwable err) {
78           Core.USER_ERROR("MsgHandler - Error invoking target: [" + rule +
79              "::" + object.getClass().getName() + "." + method +
80              "()]\nwith args...\n" + input + "\n" + err);
81           engine.notifyMonitors(MsgHandler.FAIL,new MessageHandlerEvent(this,rule,object,method,input,MessageHandlerEvent.FAIL_MASK));
82        }
83        return null;
84     }
85  }