Skip to content

Commit d95759b

Browse files
committed
Fix mapping of interval for the day of week
It fixes how the mapper handle the day of the week, leaving the interval untouched, but mapping the start day if present. Also fixes the int mapping when parsing. In unix "7/3" should be parsed as "0/3" Fixes #495
1 parent 2cf9697 commit d95759b

3 files changed

Lines changed: 40 additions & 23 deletions

File tree

src/main/java/com/cronutils/mapper/CronMapper.java

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,10 @@
2525
import com.cronutils.model.field.constraint.FieldConstraintsBuilder;
2626
import com.cronutils.model.field.definition.DayOfWeekFieldDefinition;
2727
import com.cronutils.model.field.definition.FieldDefinition;
28-
import com.cronutils.model.field.expression.Always;
29-
import com.cronutils.model.field.expression.FieldExpression;
30-
import com.cronutils.model.field.expression.On;
31-
import com.cronutils.model.field.expression.QuestionMark;
28+
import com.cronutils.model.field.expression.*;
29+
import com.cronutils.model.field.expression.visitor.FieldExpressionVisitorAdaptor;
3230
import com.cronutils.model.field.expression.visitor.ValueMappingFieldExpressionVisitor;
31+
import com.cronutils.model.field.value.FieldValue;
3332
import com.cronutils.model.field.value.IntegerFieldValue;
3433
import com.cronutils.model.field.value.SpecialChar;
3534
import com.cronutils.utils.Preconditions;
@@ -261,27 +260,45 @@ static Function<CronField, CronField> returnAlwaysExpression(final CronFieldName
261260
return field -> new CronField(name, always(), FieldConstraintsBuilder.instance().forField(name).createConstraintsInstance());
262261
}
263262

263+
private static IntegerFieldValue mapDayOfWeek(DayOfWeekFieldDefinition sourceDef, DayOfWeekFieldDefinition targetDef, IntegerFieldValue fieldValue) {
264+
return new IntegerFieldValue(ConstantsMapper.weekDayMapping(sourceDef.getMondayDoWValue(), targetDef.getMondayDoWValue(), fieldValue.getValue()));
265+
}
266+
267+
private static FieldValue<?> mapDayOfWeek(DayOfWeekFieldDefinition sourceDef, DayOfWeekFieldDefinition targetDef, FieldValue<?> fieldValue) {
268+
if (fieldValue instanceof IntegerFieldValue) {
269+
return mapDayOfWeek(sourceDef, targetDef, (IntegerFieldValue) fieldValue);
270+
}
271+
return fieldValue;
272+
}
273+
264274
@VisibleForTesting
265275
static Function<CronField, CronField> dayOfWeekMapping(final DayOfWeekFieldDefinition sourceDef, final DayOfWeekFieldDefinition targetDef) {
266276
return field -> {
267277
final FieldExpression expression = field.getExpression();
268278
FieldExpression dest = null;
269-
dest = expression.accept(
270-
new ValueMappingFieldExpressionVisitor(
271-
fieldValue -> {
272-
if (fieldValue instanceof IntegerFieldValue) {
273-
return new IntegerFieldValue(
274-
ConstantsMapper.weekDayMapping(
275-
sourceDef.getMondayDoWValue(),
276-
targetDef.getMondayDoWValue(),
277-
((IntegerFieldValue) fieldValue).getValue()
278-
)
279-
);
280-
}
281-
return fieldValue;
282-
}
283-
)
284-
);
279+
dest = expression.accept(new FieldExpressionVisitorAdaptor() {
280+
public FieldExpression visit(Every every) {
281+
return new Every(every.getExpression().accept(this), every.getPeriod());
282+
}
283+
284+
public FieldExpression visit(On on) {
285+
return new On(mapDayOfWeek(sourceDef, targetDef, on.getTime()), on.getSpecialChar());
286+
}
287+
288+
@Override
289+
public FieldExpression visit(Between between) {
290+
return new Between(mapDayOfWeek(sourceDef, targetDef, between.getFrom()), mapDayOfWeek(sourceDef, targetDef, between.getTo()));
291+
}
292+
293+
@Override
294+
public FieldExpression visit(And and) {
295+
And newAnd = new And();
296+
for (FieldExpression expr : and.getExpressions()) {
297+
newAnd.and(expr.accept(this));
298+
}
299+
return newAnd;
300+
}
301+
});
285302

286303
if (expression instanceof QuestionMark && !targetDef.getConstraints().getSpecialChars().contains(SpecialChar.QUESTION_MARK)) {
287304
dest = always();

src/main/java/com/cronutils/parser/FieldParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ private FieldExpression asteriskOrempty(final String start, final String value)
120120
if (ASTERISK.equals(trimmedStart) || EMPTY_STRING.equals(start.trim())) {
121121
return new Every(new IntegerFieldValue(Integer.parseInt(value)));
122122
} else {
123-
return new Every(new On(new IntegerFieldValue(Integer.parseInt(start))), new IntegerFieldValue(Integer.parseInt(value)));
123+
return new Every(new On(mapToIntegerFieldValue(start)), new IntegerFieldValue(Integer.parseInt(value)));
124124
}
125125
}
126126

src/test/java/com/cronutils/mapper/CronMapperIntegrationTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ public void testRangeOfTimeQuartzToSpring() {
7070

7171
@Test
7272
public void testDaysOfWeekUnixToQuartz() {
73-
final String input = "* * * * 3,5-6";
74-
final String expected = "0 * * ? * 4,6-7 *";
73+
final String input = "* * * * 3,5-6,*/2,2/3,7/4";
74+
final String expected = "0 * * ? * 4,6-7,*/2,3/3,1/4 *";
7575
assertEquals(expected, CronMapper.fromUnixToQuartz().map(unixParser().parse(input)).asString());
7676
}
7777

0 commit comments

Comments
 (0)