01: ////////////////////////////////////////////////////////////////////////////////
02: // checkstyle: Checks Java source code for adherence to a set of rules.
03: // Copyright (C) 2001-2007 Oliver Burn
04: //
05: // This library is free software; you can redistribute it and/or
06: // modify it under the terms of the GNU Lesser General Public
07: // License as published by the Free Software Foundation; either
08: // version 2.1 of the License, or (at your option) any later version.
09: //
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: package com.puppycrawl.tools.checkstyle.checks.imports;
20:
21: import com.puppycrawl.tools.checkstyle.api.Check;
22: import com.puppycrawl.tools.checkstyle.api.DetailAST;
23: import com.puppycrawl.tools.checkstyle.api.FullIdent;
24: import com.puppycrawl.tools.checkstyle.api.TokenTypes;
25:
26: /**
27: * <p>
28: * Check that finds import statements that use the * notation.
29: * </p>
30: * <p> Rationale: Importing all classes from a package leads to tight coupling
31: * between packages and might lead to problems when a new version of a library
32: * introduces name clashes.
33: * </p>
34: * <p>
35: * An example of how to configure the check is:
36: * </p>
37: * <pre>
38: * <module name="AvoidStarImport">
39: * <property name="excludes" value="java.io,java.net"/>
40: * </module>
41: * </pre>
42: *
43: * The optional "excludes" property allows for certain packages like
44: * java.io or java.net to be exempted from the rule. Note that the excludes
45: * property is not recursive, subpackages of excluded packages are not
46: * automatically excluded.
47: *
48: * Compatible with Java 1.5 source.
49: *
50: * @author Oliver Burn
51: * @author <a href="bschneider@vecna.com">Bill Schneider</a>
52: * @version 1.0
53: */
54: public class AvoidStarImportCheck extends Check {
55: /** the packages to exempt from this check. */
56: private String[] mExcludes = new String[0];
57:
58: /** {@inheritDoc} */
59: public int[] getDefaultTokens() {
60: return new int[] { TokenTypes.IMPORT };
61: }
62:
63: /**
64: * Sets the list of packages to exempt from the check.
65: * @param aExcludes a list of package names where star imports are ok
66: */
67: public void setExcludes(String[] aExcludes) {
68: mExcludes = new String[aExcludes.length];
69: for (int i = 0; i < aExcludes.length; i++) {
70: mExcludes[i] = aExcludes[i];
71: if (!mExcludes[i].endsWith(".*")) {
72: // force all package names to end with ".*" to disambiguate
73: // "java.io"
74: mExcludes[i] = mExcludes[i] + ".*";
75: }
76: }
77: }
78:
79: /** {@inheritDoc} */
80: public void visitToken(DetailAST aAST) {
81: final FullIdent name = FullIdent.createFullIdentBelow(aAST);
82: if ((name != null) && name.getText().endsWith(".*")) {
83: boolean exempt = false;
84: for (int i = 0; (i < mExcludes.length) && !exempt; i++) {
85: if (name.getText().equals(mExcludes[i])) {
86: exempt = true;
87: }
88: }
89: if (!exempt) {
90: log(aAST.getLineNo(), "import.avoidStar", name
91: .getText());
92: }
93: }
94: }
95: }
|