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.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
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
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 }