1
2
3
4
5
6
7
8
9
10 package nl.tudelft.simulation.dsol.formalisms.devs;
11
12 import java.lang.reflect.Constructor;
13 import java.lang.reflect.Method;
14
15 import nl.tudelft.simulation.dsol.SimRuntimeException;
16 import nl.tudelft.simulation.language.reflection.ClassUtil;
17
18 /***
19 * The SimEvent forms the essential scheduling mechanism for D-SOL. Objects do
20 * not invoke methods directly on eachother; they bundle the object on which the
21 * method is planned to be invoked together with the arguments and the name of
22 * the method in a simEvent. The SimEvent is then stored in the eventList and
23 * executed.
24 * <p>
25 * (c) copyright 2003 <a href="http://www.simulation.tudelft.nl">Delft
26 * University of Technology </a>, the Netherlands. <br>
27 * See for project information <a href="http://www.simulation.tudelft.nl">
28 * www.simulation.tudelft.nl </a> <br>
29 * License of use: <a href="http://www.gnu.org/copyleft/gpl.html">General Public
30 * License (GPL) </a>, no warranty <br>
31 *
32 * @author <a href="http://www.simulation.tudelft.nl/people/jacobs.html">Peter
33 * Jacobs </a>
34 * @version 1.11 2004-03-26
35 * @since 1.0
36 */
37 public class SimEvent extends AbstractSimEvent
38 {
39
40 /***
41 * source reflects the source that created the simevent
42 *
43 * @uml.property name="source"
44 */
45 protected Object source = null;
46
47 /***
48 * target reflects the target on which a state change is scheduled
49 *
50 * @uml.property name="target"
51 */
52 protected Object target = null;
53
54 /***
55 * method is the method which embodies the state change
56 *
57 * @uml.property name="method"
58 */
59 protected String method = null;
60
61 /***
62 * args are the arguments which are used to invoke the method with
63 *
64 * @uml.property name="args"
65 */
66 protected Object[] args = null;
67
68
69 /***
70 * The constuctor of the event stores the time the event must be executed
71 * and the object and method to invoke
72 *
73 * @param executionTime reflects the time the event has to be executed.
74 * @param source reflects the source that created the method
75 * @param target reflects the object on which the method must be invoked.
76 * @param method reflects the method to invoke
77 * @param args reflects the argumenst the method to invoke with
78 */
79 public SimEvent(final double executionTime, final Object source,
80 final Object target, final String method, final Object[] args)
81 {
82 this(executionTime, SimEventInterface.NORMAL_PRIORITY, source, target,
83 method, args);
84 }
85
86 /***
87 * The constuctor of the event stores the time the event must be executed
88 * and the object and method to invoke
89 *
90 * @param executionTime reflects the time the event has to be executed.
91 * @param priority reflects the priority of the event
92 * @param source reflects the source that created the method
93 * @param target reflects the object on which the method must be invoked.
94 * @param method reflects the method to invoke
95 * @param args reflects the argumenst the method to invoke with
96 */
97 public SimEvent(final double executionTime, final short priority,
98 final Object source, final Object target, final String method,
99 final Object[] args)
100 {
101 super(executionTime, priority);
102 if (source == null || target == null || method == null)
103 {
104 throw new IllegalArgumentException(
105 "either source, target or method==null");
106 }
107 this.source = source;
108 this.target = target;
109 this.method = method;
110 this.args = args;
111 }
112
113 /***
114 * @see SimEventInterface#execute()
115 */
116 public synchronized void execute() throws SimRuntimeException
117 {
118 try
119 {
120 if (this.method.equals("<init>"))
121 {
122 Constructor constructor = ClassUtil.resolveConstructor(
123 (Class) this.target, this.args);
124 if (!ClassUtil.isVisible(constructor, this.source.getClass()))
125 {
126 throw new SimRuntimeException(this.method
127 + " is not accessible for " + this.source);
128 }
129 constructor.setAccessible(true);
130 constructor.newInstance(this.args);
131 } else
132 {
133 Method method = ClassUtil.resolveMethod(this.target,
134 this.method, this.args);
135 if (!ClassUtil.isVisible(method, this.source.getClass()))
136 {
137 throw new SimRuntimeException(this.method
138 + " is not accessible for " + this.source);
139 }
140 method.setAccessible(true);
141 method.invoke(this.target, this.args);
142 }
143 } catch (Exception exception)
144 {
145 throw new SimRuntimeException(exception);
146 }
147 }
148
149 /***
150 * @return Returns the args.
151 *
152 * @uml.property name="args"
153 */
154 public Object[] getArgs()
155 {
156 return this.args;
157 }
158
159 /***
160 * @return Returns the method.
161 *
162 * @uml.property name="method"
163 */
164 public String getMethod()
165 {
166 return this.method;
167 }
168
169 /***
170 * @return Returns the source.
171 *
172 * @uml.property name="source"
173 */
174 public Object getSource()
175 {
176 return this.source;
177 }
178
179 /***
180 * @return Returns the target.
181 *
182 * @uml.property name="target"
183 */
184 public Object getTarget()
185 {
186 return this.target;
187 }
188
189 /***
190 * @see java.lang.Object#toString()
191 */
192 public String toString()
193 {
194 return "SimEvent[time=" + this.absoluteExecutionTime + "; priority="
195 + this.priority + "; source=" + this.source + "; target="
196 + this.target + "; method=" + this.method + "; args="
197 + this.args + "]";
198 }
199 }