Details
-
Wish
-
Status: Closed
-
Major
-
Resolution: Fixed
-
0.5, 0.6, 0.7, 0.8
-
None
Description
I am using the Send action to schedule a future event. The current implementation for Send requires me to express delay either as a number or a string defined in CSS2 format. My delay can be as long as 1 month, which works out to:
2678400s for Jan, Mar, May, Jul, Aug, Oct, Dec
2592000s for Apr, Jun, Sep, Nov
2419200s for Feb (non-leap years)
A straightforward way for me to calculate the number of seconds for the current month is to tap on Java's calendar classes, so I created a helper object to perform that calculation and tried calling my object in the delay expression, i.e.
<send event="charge" delay="time.ms(0,1,0,0,0,0)"/>
But this doesn't work. I get the following error message:
ERROR [log] For input string: "delay" java.lang.NumberFormatException: For input string: "time.ms(0,1,0,0,0,0)"
Looking at the code for Send, I realize that the delay expression does not get evaluated by the evaluator, unlike the other attributes. I did a little experiment and modified the Send.execute method to evaluate the delay expression before parsing. ie.
In execute(), I added:
String delayString = (String) eval.eval(ctx, delay);
long wait = parseDelay(delayString, appLog);
I then modified parseDelay() to parse delayString instead of delay, i.e.
private long parseDelay(final String delayString, final Log appLog) throws SCXMLExpressionException {
long wait = 0L;
long multiplier = 1L;
if (!SCXMLHelper.isStringEmpty(delayString)) {
String trimDelay = delayString.trim();
String numericDelay = trimDelay;
....
With these modifications, the above delay expression worked. Although this is a minor tweak, it is very useful for delay expressions that go beyond a couple of seconds or change under different scenarios.
Can this feature be included in the next release for SCXML?
Elaine