Skip to content

Commit fa8e3fa

Browse files
committed
Date comparing rule.
1 parent f52ff97 commit fa8e3fa

File tree

13 files changed

+200
-77
lines changed

13 files changed

+200
-77
lines changed

src/main/java/com/jonpereiradev/jfile/reader/file/JFileLine.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.util.SortedSet;
66
import java.util.concurrent.ConcurrentHashMap;
77
import java.util.concurrent.ConcurrentMap;
8+
import java.util.stream.Stream;
89

910
public class JFileLine implements Comparable<JFileLine> {
1011

@@ -40,7 +41,9 @@ public int hashCode() {
4041

4142
public JFileColumn getColumn(int position) {
4243
if (!columnsByPosition.containsKey(position)) {
43-
columnsByPosition.put(position, getColumns().stream().filter(o -> o.getPosition() == position).findFirst().orElse(null));
44+
Stream<JFileColumn> stream = getColumns().stream().filter(o -> o.getPosition() == position);
45+
JFileColumn column = stream.findFirst().orElseThrow(() -> new IllegalArgumentException("Position doesn't exists in line."));
46+
columnsByPosition.put(position, column);
4447
}
4548

4649
return columnsByPosition.get(position);

src/main/java/com/jonpereiradev/jfile/reader/rule/column/AbstractColumnRule.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package com.jonpereiradev.jfile.reader.rule.column;
22

33
import com.jonpereiradev.jfile.reader.file.JFileColumn;
4+
import com.jonpereiradev.jfile.reader.file.JFileLine;
45
import com.jonpereiradev.jfile.reader.rule.RuleNode;
56
import org.apache.commons.lang3.StringUtils;
67

78
public abstract class AbstractColumnRule implements ColumnRule {
89

910
private final int position;
1011

12+
private JFileLine fileLine;
1113
private RuleNode<ColumnRule> ruleNode;
1214

1315
public AbstractColumnRule(int position) {
@@ -24,6 +26,16 @@ public int getPosition() {
2426
return position;
2527
}
2628

29+
@Override
30+
public JFileLine getFileLine() {
31+
return fileLine;
32+
}
33+
34+
@Override
35+
public void setFileLine(JFileLine fileLine) {
36+
this.fileLine = fileLine;
37+
}
38+
2739
@Override
2840
public RuleNode<ColumnRule> getRuleNode() {
2941
return ruleNode;

src/main/java/com/jonpereiradev/jfile/reader/rule/column/AbstractRefRule.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package com.jonpereiradev.jfile.reader.rule.column;
22

33
import com.jonpereiradev.jfile.reader.file.JFileColumn;
4+
import com.jonpereiradev.jfile.reader.file.JFileLine;
45
import com.jonpereiradev.jfile.reader.rule.RuleNode;
56

67
public abstract class AbstractRefRule implements RefRule {
78

89
private final int refPosition;
910
private final int position;
1011

12+
private JFileLine fileLine;
1113
private RuleNode<ColumnRule> ruleNode;
1214

1315
public AbstractRefRule(int refPosition, int position) {
@@ -30,6 +32,16 @@ public int getPosition() {
3032
return position;
3133
}
3234

35+
@Override
36+
public JFileLine getFileLine() {
37+
return fileLine;
38+
}
39+
40+
@Override
41+
public void setFileLine(JFileLine fileLine) {
42+
this.fileLine = fileLine;
43+
}
44+
3345
@Override
3446
public RuleNode<ColumnRule> getRuleNode() {
3547
return ruleNode;

src/main/java/com/jonpereiradev/jfile/reader/rule/column/ColumnRule.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.jonpereiradev.jfile.reader.rule.column;
22

33
import com.jonpereiradev.jfile.reader.file.JFileColumn;
4+
import com.jonpereiradev.jfile.reader.file.JFileLine;
45
import com.jonpereiradev.jfile.reader.rule.Rule;
56
import com.jonpereiradev.jfile.reader.rule.RuleNode;
67
import org.apache.commons.lang3.StringUtils;
@@ -17,6 +18,10 @@ default boolean canValidate(JFileColumn fileColumn) {
1718

1819
int getPosition();
1920

21+
JFileLine getFileLine();
22+
23+
void setFileLine(JFileLine fileLine);
24+
2025
RuleNode<ColumnRule> getRuleNode();
2126

2227
void setRuleNode(RuleNode<ColumnRule> ruleNode);

src/main/java/com/jonpereiradev/jfile/reader/rule/column/CpfRule.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,24 @@
22

33
import com.jonpereiradev.jfile.reader.file.JFileColumn;
44

5+
import java.util.Arrays;
6+
import java.util.List;
7+
58
public class CpfRule extends AbstractColumnRule {
69

10+
private static final List<String> INVALID_CPFS = Arrays.asList(
11+
"00000000000",
12+
"11111111111",
13+
"22222222222",
14+
"33333333333",
15+
"44444444444",
16+
"55555555555",
17+
"66666666666",
18+
"77777777777",
19+
"88888888888",
20+
"99999999999"
21+
);
22+
723
public CpfRule(int position) {
824
super(position);
925
}
@@ -12,7 +28,7 @@ public CpfRule(int position) {
1228
public boolean isValid(JFileColumn fileColumn) {
1329
String cpf = fileColumn.getText();
1430

15-
if (cpf.equals("00000000000") || cpf.length() != 11) {
31+
if (cpf.length() != 11 || INVALID_CPFS.contains(cpf)) {
1632
return false;
1733
}
1834

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.jonpereiradev.jfile.reader.rule.column;
2+
3+
import com.jonpereiradev.jfile.reader.file.JFileColumn;
4+
5+
import java.text.DateFormat;
6+
import java.util.Date;
7+
8+
public class DateAfterRule extends AbstractColumnRule {
9+
10+
private final DateFormat dateFormat;
11+
private final Date min;
12+
private final int columnPosition;
13+
14+
public DateAfterRule(int position, DateFormat dateFormat, Date min) {
15+
super(position);
16+
this.dateFormat = dateFormat;
17+
this.min = min;
18+
this.columnPosition = -1;
19+
}
20+
21+
public DateAfterRule(int position, DateFormat dateFormat, int columnPosition) {
22+
super(position);
23+
this.dateFormat = dateFormat;
24+
this.min = null;
25+
this.columnPosition = columnPosition;
26+
}
27+
28+
@Override
29+
public boolean isValid(JFileColumn fileColumn) {
30+
Date date = fileColumn.getDate(dateFormat);
31+
return date.compareTo(getComparingDate()) > 0;
32+
}
33+
34+
private Date getComparingDate() {
35+
if (columnPosition == -1) {
36+
return min;
37+
}
38+
39+
return getFileLine().getColumn(columnPosition).getDate(dateFormat);
40+
}
41+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.jonpereiradev.jfile.reader.rule.column;
2+
3+
import com.jonpereiradev.jfile.reader.file.JFileColumn;
4+
5+
import java.text.DateFormat;
6+
import java.util.Date;
7+
8+
public class DateBeforeRule extends AbstractColumnRule {
9+
10+
private final DateFormat dateFormat;
11+
private final Date max;
12+
private final int columnPosition;
13+
14+
public DateBeforeRule(int position, DateFormat dateFormat, Date max) {
15+
super(position);
16+
this.dateFormat = dateFormat;
17+
this.max = max;
18+
this.columnPosition = -1;
19+
}
20+
21+
public DateBeforeRule(Integer position, DateFormat dateFormat, int columnPosition) {
22+
super(position);
23+
this.dateFormat = dateFormat;
24+
this.max = null;
25+
this.columnPosition = columnPosition;
26+
}
27+
28+
@Override
29+
public boolean isValid(JFileColumn fileColumn) {
30+
Date date = fileColumn.getDate(dateFormat);
31+
return date.compareTo(getComparingDate()) < 0;
32+
}
33+
34+
private Date getComparingDate() {
35+
if (columnPosition == -1) {
36+
return max;
37+
}
38+
39+
return getFileLine().getColumn(columnPosition).getDate(dateFormat);
40+
}
41+
}

src/main/java/com/jonpereiradev/jfile/reader/rule/column/DateMaxRule.java

Lines changed: 0 additions & 24 deletions
This file was deleted.

src/main/java/com/jonpereiradev/jfile/reader/rule/column/DateMinRule.java

Lines changed: 0 additions & 24 deletions
This file was deleted.

src/main/java/com/jonpereiradev/jfile/reader/rule/configurator/DateTypeConfigurator.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,21 @@ public interface DateTypeConfigurator extends TypedRuleConfigurator<DateTypeConf
2727
/**
2828
* defines a min date rule validation.
2929
*/
30-
DateTypeConfigurator min(Date min);
30+
DateTypeConfigurator after(Date min);
3131

3232
/**
3333
* defines a max date rule validation.
3434
*/
35-
DateTypeConfigurator max(Date max);
35+
DateTypeConfigurator before(Date max);
36+
37+
/**
38+
* defines a min date rule validation comparing to another column.
39+
*/
40+
DateTypeConfigurator after(int columnPosition);
41+
42+
/**
43+
* defines a max date rule validation comparing to another column.
44+
*/
45+
DateTypeConfigurator before(int columnPosition);
3646

3747
}

src/main/java/com/jonpereiradev/jfile/reader/rule/configurator/DateTypeConfiguratorImpl.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,22 @@ public DateTypeConfigurator pastOrPresent() {
3737
}
3838

3939
@Override
40-
public DateTypeConfigurator min(Date min) {
41-
return rule(position -> new DateMinRule(position, dateFormat, min));
40+
public DateTypeConfigurator after(Date min) {
41+
return rule(position -> new DateAfterRule(position, dateFormat, min));
4242
}
4343

4444
@Override
45-
public DateTypeConfigurator max(Date max) {
46-
return rule(position -> new DateMaxRule(position, dateFormat, max));
45+
public DateTypeConfigurator after(int columnPosition) {
46+
return rule(position -> new DateAfterRule(position, dateFormat, columnPosition));
47+
}
48+
49+
@Override
50+
public DateTypeConfigurator before(Date max) {
51+
return rule(position -> new DateBeforeRule(position, dateFormat, max));
52+
}
53+
54+
@Override
55+
public DateTypeConfigurator before(int columnPosition) {
56+
return rule(position -> new DateBeforeRule(position, dateFormat, columnPosition));
4757
}
4858
}

src/main/java/com/jonpereiradev/jfile/reader/validation/JFileValidatorEngineImpl.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,19 +61,21 @@ private void checkColumnRuleViolation(JFileLine line, List<RuleViolation> violat
6161
});
6262
}
6363

64-
private List<RuleViolation> validateColumnRules(JFileLine line, JFileColumn column, RuleNode<ColumnRule> node) {
64+
private List<RuleViolation> validateColumnRules(JFileLine fileLine, JFileColumn column, RuleNode<ColumnRule> node) {
6565
Stream<ColumnRule> stream = node.getChildrens().stream();
6666
List<ColumnRule> filtered = stream.filter(o -> o.getPosition() == column.getPosition()).collect(Collectors.toList());
6767
List<RuleViolation> violations = new ArrayList<>();
6868

6969
for (ColumnRule rule : filtered) {
70-
JFileColumn fileColumn = isRefRule(rule) ? getDependsColumn(line, (RefRule) rule) : column;
70+
JFileColumn fileColumn = isRefRule(rule) ? getDependsColumn(fileLine, (RefRule) rule) : column;
71+
72+
rule.setFileLine(fileLine);
7173

7274
if (rule instanceof ArrayOfTypeRule) {
7375
ArrayOfTypeRule arrayOf = (ArrayOfTypeRule) rule;
74-
arrayOf.split(column).forEach(o -> violations.addAll(validateColumnRules(line, o, rule.getRuleNode())));
76+
arrayOf.split(column).forEach(o -> violations.addAll(validateColumnRules(fileLine, o, rule.getRuleNode())));
7577
} else if (rule.canValidate(fileColumn)) {
76-
recursivelyValidate(line, column, rule, violations);
78+
recursivelyValidate(fileLine, column, rule, violations);
7779
}
7880

7981
if (!violations.isEmpty()) {

0 commit comments

Comments
 (0)