int colonPos = timerString.indexOf( ":" );
String protocol = null;
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;
}
// no protocol so assume interval semantics
protocol = "int";
} else {
protocol = timerString.substring( 0, colonPos );
}
int startPos = timerString.indexOf( "start" );
int endPos = timerString.indexOf( "end" );
int repeatPos = timerString.indexOf( "repeat-limit" );
Date startDate = null;
Date endDate = null;
int repeatLimit = -1;
int optionsPos = timerString.length();
if ( startPos != -1 ) {
optionsPos = startPos;
int p = ( endPos != -1 && endPos < repeatPos ) ? endPos : repeatPos;
if ( p == -1 ) {
p = timerString.length();
}
int equalsPos = timerString.indexOf( '=', startPos );
startDate = DateUtils.parseDate( timerString.substring( equalsPos + 1, p ).trim(),
context.getPackageBuilder().getDateFormats() );
}
if ( endPos != -1 ) {
if ( optionsPos > endPos ) {
optionsPos = endPos;
}
int p = ( startPos != -1 && startPos < repeatPos ) ? startPos : repeatPos;
if ( p == -1 ) {
p = timerString.length();
}
int equalsPos = timerString.indexOf( '=', endPos );
endDate = DateUtils.parseDate( timerString.substring( equalsPos + 1, p ).trim(),
context.getPackageBuilder().getDateFormats() );
}
if ( repeatPos != -1 ) {
if ( optionsPos > repeatPos ) {
optionsPos = repeatPos;
}
int p = ( startPos != -1 && startPos < endPos ) ? startPos : endPos;
if ( p == -1 ) {
p = timerString.length();
}
int equalsPos = timerString.indexOf( '=', repeatPos );
repeatLimit = Integer.parseInt( timerString.substring( equalsPos + 1, p ).trim() );
}
String body = timerString.substring( colonPos + 1, optionsPos ).trim();
Timer timer = null;
if ( "cron".equals( protocol ) ) {
try {
timer = new CronTimer( startDate, endDate, 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(startDate, endDate, 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( startDate, endDate, 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 );