Skip to content

Commit 6f91560

Browse files
committed
Merge branch 'hibnico-fix-interval-mapping'
2 parents 2cf9697 + d95759b commit 6f91560

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)