View Javadoc
1   ///////////////////////////////////////////////////////////////////////////////////////////////
2   // checkstyle: Checks Java source code and other text files for adherence to a set of rules.
3   // Copyright (C) 2001-2026 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.checks.naming;
21  
22  import com.puppycrawl.tools.checkstyle.api.DetailAST;
23  import com.puppycrawl.tools.checkstyle.api.TokenTypes;
24  import com.puppycrawl.tools.checkstyle.utils.ScopeUtil;
25  
26  /**
27   * Abstract class for checking a class member (field/method)'s name conforms to
28   * a specified pattern.
29   *
30   * <p>
31   * This class extends {@link AbstractNameCheck} with support for access level
32   * restrictions. This allows the check to be configured to be applied to one of
33   * the four Java access levels: {@code public}, {@code protected},
34   * {@code "package"}, and {@code private}.
35   * </p>
36   *
37   * <p>Level is configured using the following properties:
38   * <ol>
39   * <li>applyToPublic, default true;</li>
40   * <li>applyToProtected, default true;</li>
41   * <li>applyToPackage, default true;</li>
42   * <li>applyToPrivate, default true;</li>
43   * </ol>
44   *
45   */
46  public abstract class AbstractAccessControlNameCheck
47      extends AbstractNameCheck {
48  
49      /** If true, applies the check be public members. */
50      private boolean applyToPublic = true;
51  
52      /** If true, applies the check be protected members. */
53      private boolean applyToProtected = true;
54  
55      /** If true, applies the check be "package" members. */
56      private boolean applyToPackage = true;
57  
58      /** If true, applies the check be private members. */
59      private boolean applyToPrivate = true;
60  
61      /**
62       * Creates a new {@code AbstractAccessControlNameCheck} instance.
63       *
64       * @param format
65       *                format to check with
66       * @param messageKey
67       *                the key for the message
68       */
69      protected AbstractAccessControlNameCheck(String format, String messageKey) {
70          super(format, messageKey);
71      }
72  
73      @Override
74      protected boolean mustCheckName(DetailAST ast) {
75          return shouldCheckInScope(ast.findFirstToken(TokenTypes.MODIFIERS));
76      }
77  
78      /**
79       * Should we check member with given modifiers.
80       *
81       * @param modifiers
82       *                modifiers of member to check.
83       * @return true if we should check such member.
84       */
85      protected boolean shouldCheckInScope(DetailAST modifiers) {
86          final boolean isProtected = modifiers
87                  .findFirstToken(TokenTypes.LITERAL_PROTECTED) != null;
88          final boolean isPrivate = modifiers
89                  .findFirstToken(TokenTypes.LITERAL_PRIVATE) != null;
90          final boolean isPublic = isPublic(modifiers);
91  
92          final boolean isPackage = !(isPublic || isProtected || isPrivate);
93  
94          return applyToPublic && isPublic
95                  || applyToProtected && isProtected
96                  || applyToPackage && isPackage
97                  || applyToPrivate && isPrivate;
98      }
99  
100     /**
101      * Checks if given modifiers has public access.
102      * There are 2 cases - it is either has explicit modifier, or it is
103      * in annotation or interface.
104      *
105      * @param modifiers - modifiers to check
106      * @return true if public
107      */
108     private static boolean isPublic(DetailAST modifiers) {
109         return modifiers.findFirstToken(TokenTypes.LITERAL_PUBLIC) != null
110                 || ScopeUtil.isInAnnotationBlock(modifiers)
111                 || ScopeUtil.isInInterfaceBlock(modifiers)
112                     // interface methods can be private
113                     && modifiers.findFirstToken(TokenTypes.LITERAL_PRIVATE) == null;
114     }
115 
116     /**
117      * Setter to control if check should apply to public members.
118      *
119      * @param applyTo new value of the property.
120      */
121     public void setApplyToPublic(boolean applyTo) {
122         applyToPublic = applyTo;
123     }
124 
125     /**
126      * Setter to control if check should apply to protected members.
127      *
128      * @param applyTo new value of the property.
129      */
130     public void setApplyToProtected(boolean applyTo) {
131         applyToProtected = applyTo;
132     }
133 
134     /**
135      * Setter to control if check should apply to package-private members.
136      *
137      * @param applyTo new value of the property.
138      */
139     public void setApplyToPackage(boolean applyTo) {
140         applyToPackage = applyTo;
141     }
142 
143     /**
144      * Setter to control if check should apply to private members.
145      *
146      * @param applyTo new value of the property.
147      */
148     public void setApplyToPrivate(boolean applyTo) {
149         applyToPrivate = applyTo;
150     }
151 
152 }