Search in sources :

Example 16 with CronField

use of com.cronutils.model.field.CronField in project cron-utils by jmrozanec.

the class CronParser method parse.

/**
 * Parse string with cron expression.
 *
 * @param expression - cron expression, never null
 * @return Cron instance, corresponding to cron expression received
 * @throws java.lang.IllegalArgumentException if expression does not match cron definition
 */
public Cron parse(final String expression) {
    Preconditions.checkNotNull(expression, "Expression must not be null");
    final String replaced = expression.replaceAll("\\s+", " ").trim();
    if (StringUtils.isEmpty(replaced)) {
        throw new IllegalArgumentException("Empty expression!");
    }
    if (expression.contains("||")) {
        List<Cron> crons = Arrays.stream(expression.split("\\|\\|")).map(this::parse).collect(Collectors.toList());
        return new CompositeCron(crons);
    }
    if (expression.contains("|")) {
        List<String> crons = new ArrayList<>();
        int cronscount = Arrays.stream(expression.split("\\s+")).mapToInt(s -> s.split("\\|").length).max().orElse(0);
        for (int j = 0; j < cronscount; j++) {
            StringBuilder builder = new StringBuilder();
            for (String s : expression.split("\\s+")) {
                if (s.contains("|")) {
                    builder.append(String.format("%s ", s.split("\\|")[j]));
                } else {
                    builder.append(String.format("%s ", s));
                }
            }
            crons.add(builder.toString().trim());
        }
        return new CompositeCron(crons.stream().map(this::parse).collect(Collectors.toList()));
    } else {
        final String[] expressionParts = replaced.toUpperCase().split(" ");
        final int expressionLength = expressionParts.length;
        String fieldWithTrailingCommas = Arrays.stream(expressionParts).filter(x -> x.endsWith(",")).findAny().orElse(null);
        if (fieldWithTrailingCommas != null) {
            throw new IllegalArgumentException(String.format("Invalid field value! Trailing commas not permitted! '%s'", fieldWithTrailingCommas));
        }
        final List<CronParserField> fields = expressions.get(expressionLength);
        if (fields == null) {
            throw new IllegalArgumentException(String.format("Cron expression contains %s parts but we expect one of %s", expressionLength, expressions.keySet()));
        }
        try {
            final int size = expressionParts.length;
            final List<CronField> results = new ArrayList<>(size + 1);
            for (int j = 0; j < size; j++) {
                results.add(fields.get(j).parse(expressionParts[j]));
            }
            return new SingleCron(cronDefinition, results).validate();
        } catch (final IllegalArgumentException e) {
            throw new IllegalArgumentException(String.format("Failed to parse cron expression. %s", e.getMessage()), e);
        }
    }
}
Also used : CompositeCron(com.cronutils.model.CompositeCron) SingleCron(com.cronutils.model.SingleCron) CompositeCron(com.cronutils.model.CompositeCron) SingleCron(com.cronutils.model.SingleCron) Cron(com.cronutils.model.Cron) CronField(com.cronutils.model.field.CronField)

Example 17 with CronField

use of com.cronutils.model.field.CronField in project cron-utils by jmrozanec.

the class ExecutionTime method forCron.

/**
 * Creates execution time for given Cron.
 *
 * @param cron - Cron instance
 * @return ExecutionTime instance
 */
public static ExecutionTime forCron(final Cron cron) {
    if (cron instanceof SingleCron) {
        final Map<CronFieldName, CronField> fields = cron.retrieveFieldsAsMap();
        final ExecutionTimeBuilder executionTimeBuilder = new ExecutionTimeBuilder(cron);
        for (final CronFieldName name : CronFieldName.values()) {
            if (fields.get(name) != null) {
                switch(name) {
                    case SECOND:
                        executionTimeBuilder.forSecondsMatching(fields.get(name));
                        break;
                    case MINUTE:
                        executionTimeBuilder.forMinutesMatching(fields.get(name));
                        break;
                    case HOUR:
                        executionTimeBuilder.forHoursMatching(fields.get(name));
                        break;
                    case DAY_OF_WEEK:
                        executionTimeBuilder.forDaysOfWeekMatching(fields.get(name));
                        break;
                    case DAY_OF_MONTH:
                        executionTimeBuilder.forDaysOfMonthMatching(fields.get(name));
                        break;
                    case MONTH:
                        executionTimeBuilder.forMonthsMatching(fields.get(name));
                        break;
                    case YEAR:
                        executionTimeBuilder.forYearsMatching(fields.get(name));
                        break;
                    case DAY_OF_YEAR:
                        executionTimeBuilder.forDaysOfYearMatching(fields.get(name));
                        break;
                    default:
                        break;
                }
            }
        }
        return executionTimeBuilder.build();
    } else {
        return new CompositeExecutionTime(((CompositeCron) cron).getCrons().parallelStream().map(ExecutionTime::forCron).collect(Collectors.toList()));
    }
}
Also used : CronFieldName(com.cronutils.model.field.CronFieldName) CompositeCron(com.cronutils.model.CompositeCron) SingleCron(com.cronutils.model.SingleCron) CronField(com.cronutils.model.field.CronField)

Example 18 with CronField

use of com.cronutils.model.field.CronField in project cron-utils by jmrozanec.

the class ExecutionTimeBuilder method build.

protected ExecutionTime build() {
    boolean lowestAssigned = false;
    if (seconds == null) {
        seconds = timeNodeLowest(CronFieldName.SECOND, 0, 59);
    } else {
        lowestAssigned = true;
    }
    if (minutes == null) {
        minutes = lowestAssigned ? timeNodeAlways(CronFieldName.MINUTE, 0, 59) : timeNodeLowest(CronFieldName.MINUTE, 0, 59);
    } else {
        lowestAssigned = true;
    }
    if (hours == null) {
        hours = lowestAssigned ? timeNodeAlways(CronFieldName.HOUR, 0, 23) : timeNodeLowest(CronFieldName.HOUR, 0, 23);
    } else {
        lowestAssigned = true;
    }
    if (daysOfMonthCronField == null) {
        final FieldConstraints constraints = getConstraint(CronFieldName.DAY_OF_MONTH);
        daysOfMonthCronField = lowestAssigned ? new CronField(CronFieldName.DAY_OF_MONTH, always(), constraints) : new CronField(CronFieldName.DAY_OF_MONTH, new On(new IntegerFieldValue(1)), constraints);
    } else {
        lowestAssigned = true;
    }
    if (daysOfWeekCronField == null) {
        final FieldConstraints constraints = getConstraint(CronFieldName.DAY_OF_WEEK);
        daysOfWeekCronField = lowestAssigned ? new CronField(CronFieldName.DAY_OF_WEEK, always(), constraints) : new CronField(CronFieldName.DAY_OF_WEEK, new On(new IntegerFieldValue(1)), constraints);
    } else {
        lowestAssigned = true;
    }
    if (months == null) {
        months = lowestAssigned ? timeNodeAlways(CronFieldName.MONTH, 1, 12) : timeNodeLowest(CronFieldName.MONTH, 1, 12);
    }
    if (yearsValueGenerator == null) {
        yearsValueGenerator = FieldValueGeneratorFactory.forCronField(new CronField(CronFieldName.YEAR, always(), getConstraint(CronFieldName.YEAR)));
    }
    if (daysOfYearCronField == null) {
        final FieldConstraints constraints = getConstraint(CronFieldName.DAY_OF_YEAR);
        daysOfYearCronField = new CronField(CronFieldName.DAY_OF_YEAR, lowestAssigned ? FieldExpression.questionMark() : always(), constraints);
    }
    return new SingleExecutionTime(this.cron.getCronDefinition(), this.cron.retrieve(CronFieldName.YEAR), daysOfWeekCronField, daysOfMonthCronField, daysOfYearCronField, months, hours, minutes, seconds);
}
Also used : IntegerFieldValue(com.cronutils.model.field.value.IntegerFieldValue) FieldConstraints(com.cronutils.model.field.constraint.FieldConstraints) CronField(com.cronutils.model.field.CronField) On(com.cronutils.model.field.expression.On)

Example 19 with CronField

use of com.cronutils.model.field.CronField in project cron-utils by jmrozanec.

the class CronDescriptorTest method testEverySecondInMonth.

@Test
public void testEverySecondInMonth() {
    final int month = 2;
    final List<CronField> results = new ArrayList<>();
    results.add(new CronField(CronFieldName.HOUR, FieldExpression.always(), nullFieldConstraints));
    results.add(new CronField(CronFieldName.MINUTE, FieldExpression.always(), nullFieldConstraints));
    results.add(new CronField(CronFieldName.SECOND, FieldExpression.always(), nullFieldConstraints));
    results.add(new CronField(CronFieldName.MONTH, new On(new IntegerFieldValue(month)), nullFieldConstraints));
    assertEquals("every second at February month", descriptor.describe(new SingleCron(mockDefinition, results)));
}
Also used : ArrayList(java.util.ArrayList) IntegerFieldValue(com.cronutils.model.field.value.IntegerFieldValue) SingleCron(com.cronutils.model.SingleCron) CronField(com.cronutils.model.field.CronField) On(com.cronutils.model.field.expression.On) Test(org.junit.Test)

Example 20 with CronField

use of com.cronutils.model.field.CronField in project cron-utils by jmrozanec.

the class CronDescriptorTest method testDescribeEveryXMinutesBetweenTime.

@Test
public void testDescribeEveryXMinutesBetweenTime() {
    final int hour = 11;
    final int start = 0;
    final int end = 10;
    final Between expression = new Between(new IntegerFieldValue(start), new IntegerFieldValue(end));
    final List<CronField> results = new ArrayList<>();
    results.add(new CronField(CronFieldName.MINUTE, expression, nullFieldConstraints));
    results.add(new CronField(CronFieldName.HOUR, new On(new IntegerFieldValue(hour)), nullFieldConstraints));
    assertEquals(String.format("every minute between %s:%02d and %s:%02d", hour, start, hour, end), descriptor.describe(new SingleCron(mockDefinition, results)));
}
Also used : Between(com.cronutils.model.field.expression.Between) ArrayList(java.util.ArrayList) IntegerFieldValue(com.cronutils.model.field.value.IntegerFieldValue) SingleCron(com.cronutils.model.SingleCron) CronField(com.cronutils.model.field.CronField) On(com.cronutils.model.field.expression.On) Test(org.junit.Test)

Aggregations

CronField (com.cronutils.model.field.CronField)34 IntegerFieldValue (com.cronutils.model.field.value.IntegerFieldValue)18 Test (org.junit.Test)16 On (com.cronutils.model.field.expression.On)15 SingleCron (com.cronutils.model.SingleCron)13 ArrayList (java.util.ArrayList)13 Before (org.junit.Before)7 Between (com.cronutils.model.field.expression.Between)6 SpecialCharFieldValue (com.cronutils.model.field.value.SpecialCharFieldValue)5 FieldConstraints (com.cronutils.model.field.constraint.FieldConstraints)4 WeekDay (com.cronutils.mapper.WeekDay)3 Cron (com.cronutils.model.Cron)3 CronFieldName (com.cronutils.model.field.CronFieldName)3 Every (com.cronutils.model.field.expression.Every)3 PrepareForTest (org.powermock.core.classloader.annotations.PrepareForTest)3 CompositeCron (com.cronutils.model.CompositeCron)2 And (com.cronutils.model.field.expression.And)2 ValidationFieldExpressionVisitor (com.cronutils.model.field.expression.visitor.ValidationFieldExpressionVisitor)2 CronConstraint (com.cronutils.model.definition.CronConstraint)1 FieldConstraintsBuilder (com.cronutils.model.field.constraint.FieldConstraintsBuilder)1