001///////////////////////////////////////////////////////////////////////////////////////////////
002// checkstyle: Checks Java source code and other text files for adherence to a set of rules.
003// Copyright (C) 2001-2025 the original author or authors.
004//
005// This library is free software; you can redistribute it and/or
006// modify it under the terms of the GNU Lesser General Public
007// License as published by the Free Software Foundation; either
008// version 2.1 of the License, or (at your option) any later version.
009//
010// This library is distributed in the hope that it will be useful,
011// but WITHOUT ANY WARRANTY; without even the implied warranty of
012// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
013// Lesser General Public License for more details.
014//
015// You should have received a copy of the GNU Lesser General Public
016// License along with this library; if not, write to the Free Software
017// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
018///////////////////////////////////////////////////////////////////////////////////////////////
019
020package com.puppycrawl.tools.checkstyle.filters;
021
022import java.util.regex.Pattern;
023
024import com.puppycrawl.tools.checkstyle.AbstractAutomaticBean;
025import com.puppycrawl.tools.checkstyle.api.AuditEvent;
026import com.puppycrawl.tools.checkstyle.api.Filter;
027
028/**
029 * <div>
030 * Filter {@code SuppressionSingleFilter} suppresses audit events for Checks violations in the
031 * specified file, class, checks, message, module id, lines, and columns.
032 * </div>
033 *
034 * <p>
035 * Rationale: To allow users to use suppressions configured in the same config as other modules.
036 * {@code SuppressionFilter} and {@code SuppressionXpathFilter} require a separate file.
037 * </p>
038 *
039 * <p>
040 * Advice: If checkstyle configuration is used for several projects, single suppressions on common
041 * files/folders is better to put in checkstyle configuration as common rule. All suppression that
042 * are for specific file names is better to keep in project specific config file.
043 * </p>
044 *
045 * <p>
046 * Attention: This filter only supports single suppression, and will need multiple instances if
047 * users wants to suppress multiple violations.
048 * </p>
049 *
050 * <p>
051 * Notes:
052 * {@code SuppressionSingleFilter} can suppress Checks that have {@code Treewalker} or
053 * {@code Checker} as parent module.
054 * </p>
055 *
056 * @since 8.23
057 */
058public class SuppressionSingleFilter extends AbstractAutomaticBean implements Filter {
059
060    /**
061     * SuppressFilterElement instance.
062     */
063    private SuppressFilterElement filter;
064    /**
065     * Define the RegExp for matching against the file name associated with an audit event.
066     */
067    private Pattern files;
068    /**
069     * Define the RegExp for matching against the name of the check associated with an audit event.
070     */
071    private Pattern checks;
072    /**
073     * Define the RegExp for matching against the message of the check associated with an audit
074     * event.
075     */
076    private Pattern message;
077    /**
078     * Specify a string matched against the ID of the check associated with an audit event.
079     */
080    private String id;
081    /**
082     * Specify a comma-separated list of values, where each value is an integer or a range of
083     * integers denoted by integer-integer.
084     */
085    private String lines;
086    /**
087     * Specify a comma-separated list of values, where each value is an integer or a range of
088     * integers denoted by integer-integer.
089     */
090    private String columns;
091
092    /**
093     * Setter to define the RegExp for matching against the file name associated with an audit
094     * event.
095     *
096     * @param files regular expression for filtered file names
097     * @since 8.23
098     */
099    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}