1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package com.puppycrawl.tools.checkstyle.filters;
21
22 import java.util.Objects;
23 import java.util.regex.Pattern;
24
25 import com.puppycrawl.tools.checkstyle.api.AuditEvent;
26 import com.puppycrawl.tools.checkstyle.api.Filter;
27
28
29
30
31
32
33
34
35
36
37
38
39
40 public class SuppressFilterElement
41 implements Filter {
42
43
44 private final Pattern fileRegexp;
45
46
47 private final Pattern checkRegexp;
48
49
50 private final Pattern messageRegexp;
51
52
53 private final String moduleId;
54
55
56 private final CsvFilterElement lineFilter;
57
58
59 private final String linesCsv;
60
61
62 private final CsvFilterElement columnFilter;
63
64
65 private final String columnsCsv;
66
67
68
69
70
71
72
73
74
75
76
77 public SuppressFilterElement(Pattern files, Pattern checks, Pattern message, String moduleId,
78 String lines, String columns) {
79 fileRegexp = files;
80 checkRegexp = checks;
81 messageRegexp = message;
82 this.moduleId = moduleId;
83 if (lines == null) {
84 linesCsv = null;
85 lineFilter = null;
86 }
87 else {
88 linesCsv = lines;
89 lineFilter = new CsvFilterElement(lines);
90 }
91 if (columns == null) {
92 columnsCsv = null;
93 columnFilter = null;
94 }
95 else {
96 columnsCsv = columns;
97 columnFilter = new CsvFilterElement(columns);
98 }
99 }
100
101
102
103
104
105
106
107
108
109
110
111
112
113 public SuppressFilterElement(String files, String checks,
114 String message, String modId, String lines, String columns) {
115 this(toPattern(files), toPattern(checks), toPattern(message),
116 modId, lines, columns);
117 }
118
119
120
121
122
123
124
125
126 private static Pattern toPattern(String regex) {
127 final Pattern result;
128 if (regex != null) {
129 result = Pattern.compile(regex);
130 }
131 else {
132 result = null;
133 }
134 return result;
135 }
136
137 @Override
138 public boolean accept(AuditEvent event) {
139 return !isFileNameAndModuleNameMatching(event)
140 || !isMessageNameMatching(event)
141 || !isLineAndColumnMatching(event);
142 }
143
144
145
146
147
148
149
150 private boolean isFileNameAndModuleNameMatching(AuditEvent event) {
151 return event.getFileName() != null
152 && (fileRegexp == null || fileRegexp.matcher(event.getFileName()).find())
153 && event.getViolation() != null
154 && (moduleId == null || moduleId.equals(event.getModuleId()))
155 && (checkRegexp == null || checkRegexp.matcher(event.getSourceName()).find());
156 }
157
158
159
160
161
162
163
164 private boolean isMessageNameMatching(AuditEvent event) {
165 return messageRegexp == null || messageRegexp.matcher(event.getMessage()).find();
166 }
167
168
169
170
171
172
173
174 private boolean isLineAndColumnMatching(AuditEvent event) {
175 return lineFilter == null && columnFilter == null
176 || lineFilter != null && lineFilter.accept(event.getLine())
177 || columnFilter != null && columnFilter.accept(event.getColumn());
178 }
179
180 @Override
181 public int hashCode() {
182 return Objects.hash(getPatternSafely(fileRegexp), getPatternSafely(checkRegexp),
183 getPatternSafely(messageRegexp), moduleId, linesCsv, columnsCsv);
184 }
185
186 @Override
187 public boolean equals(Object other) {
188 if (this == other) {
189 return true;
190 }
191 if (other == null || getClass() != other.getClass()) {
192 return false;
193 }
194 final SuppressFilterElement suppressElement = (SuppressFilterElement) other;
195 return Objects.equals(getPatternSafely(fileRegexp),
196 getPatternSafely(suppressElement.fileRegexp))
197 && Objects.equals(getPatternSafely(checkRegexp),
198 getPatternSafely(suppressElement.checkRegexp))
199 && Objects.equals(getPatternSafely(messageRegexp),
200 getPatternSafely(suppressElement.messageRegexp))
201 && Objects.equals(moduleId, suppressElement.moduleId)
202 && Objects.equals(linesCsv, suppressElement.linesCsv)
203 && Objects.equals(columnsCsv, suppressElement.columnsCsv);
204 }
205
206
207
208
209
210
211
212
213 private static String getPatternSafely(Pattern pattern) {
214 String result = null;
215 if (pattern != null) {
216 result = pattern.pattern();
217 }
218 return result;
219 }
220 }