001/////////////////////////////////////////////////////////////////////////////////////////////// 002// checkstyle: Checks Java source code and other text files for adherence to a set of rules. 003// Copyright (C) 2001-2026 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.TreeWalkerAuditEvent; 026import com.puppycrawl.tools.checkstyle.TreeWalkerFilter; 027 028/** 029 * <div> 030 * Filter {@code SuppressionXpathSingleFilter} suppresses audit events for Checks 031 * violations in the specified file, class, checks, message, module id, and xpath. 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 041 * on common files/folders is better to put in checkstyle configuration as common rule. 042 * All suppression that are for specific file names is better to keep in project 043 * specific config file. 044 * </p> 045 * 046 * <p> 047 * Attention: This filter only supports single suppression, and will need multiple 048 * instances if users wants to suppress multiple violations. 049 * </p> 050 * 051 * <p> 052 * Notes: 053 * {@code SuppressionXpathSingleFilter} can suppress Checks that have {@code Treewalker} as parent module. 054 * </p> 055 * 056 * @since 8.18 057 */ 058public class SuppressionXpathSingleFilter extends AbstractAutomaticBean implements 059 TreeWalkerFilter { 060 /** 061 * XpathFilterElement instance. 062 */ 063 private XpathFilterElement xpathFilter; 064 /** 065 * Define a Regular Expression matched against the file name associated with an audit event. 066 */ 067 private Pattern files; 068 /** 069 * Define a Regular Expression matched against the name of the check associated 070 * with an audit event. 071 */ 072 private Pattern checks; 073 /** 074 * Define a Regular Expression matched against the message of the check 075 * associated with an audit event. 076 */ 077 private Pattern message; 078 /** 079 * Define a string matched against the ID of the check associated with an audit event. 080 */ 081 private String id; 082 /** 083 * Define a string xpath query. 084 */ 085 private String query; 086 087 /** 088 * Setter to define a Regular Expression matched against the file name 089 * associated with an audit event. 090 * 091 * @param files the name of the file 092 * @since 8.18 093 */ 094 public void setFiles(String files) { 095 if (files == null) { 096 this.files = null; 097 } 098 else { 099 this.files = Pattern.compile(files); 100 } 101 } 102 103 /** 104 * Setter to define a Regular Expression matched against the name of the check 105 * associated with an audit event. 106 * The pattern is matched against the fully qualified class name of the Check. 107 * 108 * @param checks the name of the check 109 * @since 8.18 110 */ 111 public void setChecks(String checks) { 112 if (checks == null) { 113 this.checks = null; 114 } 115 else { 116 this.checks = Pattern.compile(checks); 117 } 118 } 119 120 /** 121 * Setter to define a Regular Expression matched against the message of 122 * the check associated with an audit event. 123 * 124 * @param message the message of the check 125 * @since 8.18 126 */ 127 public void setMessage(String message) { 128 if (message == null) { 129 this.message = null; 130 } 131 else { 132 this.message = Pattern.compile(message); 133 } 134 } 135 136 /** 137 * Setter to define a string matched against the ID of the check associated 138 * with an audit event. 139 * 140 * @param id the ID of the check 141 * @since 8.18 142 */ 143 public void setId(String id) { 144 this.id = id; 145 } 146 147 /** 148 * Setter to define a string xpath query. 149 * 150 * @param query the xpath query 151 * @since 8.18 152 */ 153 public void setQuery(String query) { 154 this.query = query; 155 } 156 157 @Override 158 protected void finishLocalSetup() { 159 xpathFilter = new XpathFilterElement(files, checks, message, id, query); 160 } 161 162 @Override 163 public boolean accept(TreeWalkerAuditEvent treeWalkerAuditEvent) { 164 return xpathFilter.accept(treeWalkerAuditEvent); 165 } 166 167}