Skip to content

Commit 329e40f

Browse files
authored
Merge pull request #454 from IndeedSi/428-enforce-valid-range-in-execution-time
#428 Pass valid range constraints from cron definition to execution time
2 parents 2715091 + f964ab7 commit 329e40f

2 files changed

Lines changed: 30 additions & 4 deletions

File tree

src/main/java/com/cronutils/model/time/SingleExecutionTime.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,17 @@ public class SingleExecutionTime implements ExecutionTime {
8585
final CronField daysOfMonthCronField, final CronField daysOfYearCronField, final TimeNode months, final TimeNode hours,
8686
final TimeNode minutes, final TimeNode seconds) {
8787
this.cronDefinition = Preconditions.checkNotNull(cronDefinition);
88-
FieldValueGenerator alwaysGenerator = FieldValueGeneratorFactory.forCronField(new CronField(CronFieldName.YEAR, Always.always(), FieldConstraintsBuilder.instance().createConstraintsInstance()));
8988
if(cronDefinition.containsFieldDefinition(CronFieldName.YEAR)){
9089
if(!cronDefinition.getFieldDefinition(CronFieldName.YEAR).isOptional()){
9190
Preconditions.checkNotNull(yearsValueCronField);
9291
}
93-
this.yearsValueGenerator = yearsValueCronField==null?alwaysGenerator:createYearValueGeneratorInstance(yearsValueCronField);
94-
} else{
95-
this.yearsValueGenerator = alwaysGenerator;
92+
this.yearsValueGenerator = (yearsValueCronField == null)
93+
? FieldValueGeneratorFactory.forCronField(new CronField(CronFieldName.YEAR, Always.always(),
94+
cronDefinition.getFieldDefinition(CronFieldName.YEAR).getConstraints()))
95+
: createYearValueGeneratorInstance(yearsValueCronField);
96+
} else {
97+
this.yearsValueGenerator = FieldValueGeneratorFactory.forCronField(new CronField(CronFieldName.YEAR, Always.always(),
98+
FieldConstraintsBuilder.instance().createConstraintsInstance()));
9699
}
97100
this.daysOfWeekCronField = Preconditions.checkNotNull(daysOfWeekCronField);
98101
this.daysOfMonthCronField = Preconditions.checkNotNull(daysOfMonthCronField);

src/test/java/com/cronutils/model/time/ExecutionTimeQuartzIntegrationTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@
3030
import java.util.Optional;
3131
import java.util.TimeZone;
3232

33+
import com.cronutils.model.CronType;
34+
import com.cronutils.model.definition.CronDefinition;
35+
import org.junit.Assert;
3336
import org.junit.Before;
3437
import org.junit.Ignore;
3538
import org.junit.Test;
@@ -904,6 +907,26 @@ public void testLastExecutionIssue424() {
904907
}
905908
}
906909

910+
/**
911+
* Issue #428
912+
* Enforce year constraints from Quartz cron definition
913+
*/
914+
@Test
915+
public void testBoundary() {
916+
ExecutionTime execution = ExecutionTime.forCron(parser.parse("0 0 12 * * ?"));
917+
// Before 1970
918+
ZonedDateTime dateTimeBefore1970 = ZonedDateTime.of(1900, 1, 1, 0, 0, 0, 0, ZoneOffset.UTC);
919+
Optional<ZonedDateTime> next = execution.nextExecution(dateTimeBefore1970);
920+
assertTrue(next.isPresent());
921+
Assert.assertEquals(ZonedDateTime.of(1970, 1, 1, 12, 0, 0, 0, ZoneOffset.UTC), next.get());
922+
923+
// After 2099
924+
ZonedDateTime dateTimeAfter2099 = ZonedDateTime.of(2150, 1, 1, 0, 0, 0, 0, ZoneOffset.UTC);
925+
Optional<ZonedDateTime> last = execution.lastExecution(dateTimeAfter2099);
926+
assertTrue(last.isPresent());
927+
Assert.assertEquals(ZonedDateTime.of(2099, 12, 31, 12, 0, 0, 0, ZoneOffset.UTC), last.get());
928+
}
929+
907930
private Duration getMinimumInterval(final String quartzPattern) {
908931
final ExecutionTime executionTime = ExecutionTime.forCron(parser.parse(quartzPattern));
909932
final ZonedDateTime coolDay = ZonedDateTime.of(2016, 1, 1, 0, 0, 0, 0, UTC);

0 commit comments

Comments
 (0)