1 ///////////////////////////////////////////////////////////////////////////////////////////////
2 // checkstyle: Checks Java source code and other text files for adherence to a set of rules.
3 // Copyright (C) 2001-2025 the original author or authors.
4 //
5 // This library is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU Lesser General Public
7 // License as published by the Free Software Foundation; either
8 // version 2.1 of the License, or (at your option) any later version.
9 //
10 // This library is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 // Lesser General Public License for more details.
14 //
15 // You should have received a copy of the GNU Lesser General Public
16 // License along with this library; if not, write to the Free Software
17 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 ///////////////////////////////////////////////////////////////////////////////////////////////
19
20 package com.puppycrawl.tools.checkstyle.filters;
21
22 import java.util.regex.Pattern;
23
24 import com.puppycrawl.tools.checkstyle.AbstractAutomaticBean;
25 import com.puppycrawl.tools.checkstyle.api.AuditEvent;
26 import com.puppycrawl.tools.checkstyle.api.Filter;
27
28 /**
29 * <div>
30 * Filter {@code SuppressionSingleFilter} suppresses audit events for Checks violations in the
31 * specified file, class, checks, message, module id, lines, and columns.
32 * </div>
33 *
34 * <p>
35 * Rationale: To allow users to use suppressions configured in the same config as other modules.
36 * {@code SuppressionFilter} and {@code SuppressionXpathFilter} require a separate file.
37 * </p>
38 *
39 * <p>
40 * Advice: If checkstyle configuration is used for several projects, single suppressions on common
41 * files/folders is better to put in checkstyle configuration as common rule. All suppression that
42 * are for specific file names is better to keep in project specific config file.
43 * </p>
44 *
45 * <p>
46 * Attention: This filter only supports single suppression, and will need multiple instances if
47 * users wants to suppress multiple violations.
48 * </p>
49 *
50 * <p>
51 * Notes:
52 * {@code SuppressionSingleFilter} can suppress Checks that have {@code Treewalker} or
53 * {@code Checker} as parent module.
54 * </p>
55 *
56 * @since 8.23
57 */
58 public class SuppressionSingleFilter extends AbstractAutomaticBean implements Filter {
59
60 /**
61 * SuppressFilterElement instance.
62 */
63 private SuppressFilterElement filter;
64 /**
65 * Define the RegExp for matching against the file name associated with an audit event.
66 */
67 private Pattern files;
68 /**
69 * Define the RegExp for matching against the name of the check associated with an audit event.
70 */
71 private Pattern checks;
72 /**
73 * Define the RegExp for matching against the message of the check associated with an audit
74 * event.
75 */
76 private Pattern message;
77 /**
78 * Specify a string matched against the ID of the check associated with an audit event.
79 */
80 private String id;
81 /**
82 * Specify a comma-separated list of values, where each value is an integer or a range of
83 * integers denoted by integer-integer.
84 */
85 private String lines;
86 /**
87 * Specify a comma-separated list of values, where each value is an integer or a range of
88 * integers denoted by integer-integer.
89 */
90 private String columns;
91
92 /**
93 * Setter to define the RegExp for matching against the file name associated with an audit
94 * event.
95 *
96 * @param files regular expression for filtered file names
97 * @since 8.23
98 */
99 public void setFiles(Pattern files) {
100 this.files = files;
101 }
102
103 /**
104 * Setter to define the RegExp for matching against the name of the check associated with an
105 * audit event.
106 *
107 * @param checks the name of the check
108 * @since 8.23
109 */
110 public void setChecks(String checks) {
111 this.checks = Pattern.compile(checks);
112 }
113
114 /**
115 * Setter to define the RegExp for matching against the message of the check associated with
116 * an audit event.
117 *
118 * @param message the message of the check
119 * @since 8.23
120 */
121 public void setMessage(Pattern message) {
122 this.message = message;
123 }
124
125 /**
126 * Setter to specify a string matched against the ID of the check associated with an audit
127 * event.
128 *
129 * @param id the ID of the check
130 * @since 8.23
131 */
132 public void setId(String id) {
133 this.id = id;
134 }
135
136 /**
137 * Setter to specify a comma-separated list of values, where each value is an integer or a
138 * range of integers denoted by integer-integer.
139 *
140 * @param lines the lines of the check
141 * @since 8.23
142 */
143 public void setLines(String lines) {
144 this.lines = lines;
145 }
146
147 /**
148 * Setter to specify a comma-separated list of values, where each value is an integer or a
149 * range of integers denoted by integer-integer.
150 *
151 * @param columns the columns of the check
152 * @since 8.23
153 */
154 public void setColumns(String columns) {
155 this.columns = columns;
156 }
157
158 @Override
159 protected void finishLocalSetup() {
160 filter = new SuppressFilterElement(files, checks, message, id, lines, columns);
161 }
162
163 @Override
164 public boolean accept(AuditEvent event) {
165 return filter.accept(event);
166 }
167
168 }