View Javadoc
1   ///////////////////////////////////////////////////////////////////////////////////////////////
2   // checkstyle: Checks Java source code and other text files for adherence to a set of rules.
3   // Copyright (C) 2001-2024 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.imports;
21  
22  import java.util.regex.Pattern;
23  
24  /**
25   * Represents an import rules for a specific file. Only the file name is
26   * considered and only files processed by TreeWalker. The file's
27   * extension is ignored.
28   */
29  class FileImportControl extends AbstractImportControl {
30      /** The name for the file. */
31      private final String name;
32      /** The regex pattern for exact matches - only not null if regex is true. */
33      private final Pattern patternForExactMatch;
34      /** If this file name represents a regular expression. */
35      private final boolean regex;
36  
37      /**
38       * Construct a file node.
39       *
40       * @param parent the parent node.
41       * @param name the name of the file.
42       * @param regex flags interpretation of name as regex pattern.
43       */
44      /* package */ FileImportControl(PkgImportControl parent, String name, boolean regex) {
45          super(parent, MismatchStrategy.DELEGATE_TO_PARENT);
46          this.regex = regex;
47          this.name = name;
48          patternForExactMatch = createPatternForExactMatch(name);
49      }
50  
51      /**
52       * Creates a Pattern from {@code expression}.
53       *
54       * @param expression a self-contained regular expression matching the full
55       *     file name exactly.
56       * @return a Pattern.
57       */
58      private static Pattern createPatternForExactMatch(String expression) {
59          return Pattern.compile(expression);
60      }
61  
62      @Override
63      public AbstractImportControl locateFinest(String forPkg, String forFileName) {
64          AbstractImportControl finestMatch = null;
65          // Check if we are a match.
66          if (matchesExactly(forPkg, forFileName)) {
67              finestMatch = this;
68          }
69          return finestMatch;
70      }
71  
72      @Override
73      protected boolean matchesExactly(String pkg, String fileName) {
74          final boolean result;
75          if (fileName == null) {
76              result = false;
77          }
78          else if (regex) {
79              result = patternForExactMatch.matcher(fileName).matches();
80          }
81          else {
82              result = name.equals(fileName);
83          }
84          return result;
85      }
86  }