int colonPos = timerString.indexOf( ":" );
int semicolonPos = timerString.indexOf( ";" );
String protocol = "int"; // default protocol
if ( colonPos == -1 ) {
if ( timerString.startsWith( "int" ) || timerString.startsWith( "cron" ) || timerString.startsWith( "expr" ) ) {
DroolsError err = new RuleBuildError( rule, context.getParentDescr(), null,
"Incorrect timer definition '" + timerString + "' - missing colon?" );
context.addError( err );
return;
}
} else {
protocol = timerString.substring( 0, colonPos );
}
String startDate = extractParam(timerString, "start");
String endDate = extractParam(timerString, "end");
String repeatLimitString = extractParam(timerString, "repeat-limit");
int repeatLimit = repeatLimitString != null ? Integer.parseInt( repeatLimitString ) : -1;
String body = timerString.substring( colonPos + 1, semicolonPos > 0 ? semicolonPos : timerString.length() ).trim();
Timer timer = null;
if ( "cron".equals( protocol ) ) {
try {
timer = new CronTimer( createMVELExpr(startDate, context), createMVELExpr(endDate, context), repeatLimit, new CronExpression( body ) );
} catch ( ParseException e ) {
DroolsError err = new RuleBuildError( rule, context.getParentDescr(), null,
"Unable to build set timer '" + timerString + "'" );
context.addError( err );
return;
}
} else if ( "int".equals( protocol ) ) {
String[] times = body.trim().split( "\\s" );
long delay = 0;
long period = 0;
if ( times.length > 2 ) {
DroolsError err = new RuleBuildError( rule, context.getParentDescr(), null,
"Incorrect number of arguments for interval timer '" + timerString + "'" );
context.addError( err );
return;
}
try {
if ( times.length == 1 ) {
// only defines a delay
delay = TimeUtils.parseTimeString( times[0] );
} else {
// defines a delay and a period for intervals
delay = TimeUtils.parseTimeString( times[0] );
period = TimeUtils.parseTimeString( times[1] );
}
} catch (RuntimeException e) {
DroolsError err = new RuleBuildError( rule, context.getParentDescr(), null,
"Incorrect timer definition '" + timerString + "' " + e.getMessage() );
context.addError( err );
return;
}
timer = new IntervalTimer( createMVELExpr(startDate, context), createMVELExpr(endDate, context), repeatLimit, delay, period );
} else if ( "expr".equals( protocol ) ) {
body = body.trim();
StringTokenizer tok = new StringTokenizer( body, ",;" );
if ( tok.countTokens() > 2 ) {
DroolsError err = new RuleBuildError( rule, context.getParentDescr(), null,
"Incorrect number of arguments for expression timer '" + timerString + "'" );
context.addError( err );
return;
}
MVELObjectExpression times = MVELObjectExpressionBuilder.build( tok.nextToken().trim(), context );
MVELObjectExpression period = null;
if ( tok.hasMoreTokens() ) {
period = MVELObjectExpressionBuilder.build( tok.nextToken().trim(), context );
} else {
period = MVELObjectExpressionBuilder.build( "0", context );
}
timer = new ExpressionIntervalTimer( createMVELExpr(startDate, context), createMVELExpr(endDate, context), repeatLimit, times, period );
} else {
DroolsError err = new RuleBuildError( rule, context.getParentDescr(), null,
"Protocol for timer does not exist '" + timerString +"'" );
context.addError( err );
return;
}
rule.setTimer( timer );