001: ////////////////////////////////////////////////////////////////////////////////
002: // checkstyle: Checks Java source code for adherence to a set of rules.
003: // Copyright (C) 2001-2007 Oliver Burn
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: package com.puppycrawl.tools.checkstyle.checks.imports;
020:
021: /**
022: * Represents whether a package is allowed to be used or not.
023: * @author Oliver Burn
024: */
025: class Guard {
026: /** Indicates if allow access or not. */
027: private final boolean mAllowed;
028: /** Package to control access to. */
029: private final String mPkgName;
030: /** Package to control access to. */
031: private final String mClassName;
032:
033: /**
034: * Indicates if must be an exact match. Only valid if guard using a
035: * package.
036: */
037: private final boolean mExactMatch;
038: /** Indicates if the guard only applies to this package. */
039: private final boolean mLocalOnly;
040:
041: /**
042: * Constructs an instance.
043: * @param aAllow whether to allow access.
044: * @param aLocalOnly whether guard is to be applied locally only
045: * @param aPkgName the package to apply guard on.
046: * @param aExactMatch whether the package must match exactly.
047: */
048: Guard(final boolean aAllow, final boolean aLocalOnly,
049: final String aPkgName, final boolean aExactMatch) {
050: mAllowed = aAllow;
051: mLocalOnly = aLocalOnly;
052: mPkgName = aPkgName;
053: mClassName = null;
054: mExactMatch = aExactMatch;
055: }
056:
057: /**
058: * Constructs an instance.
059: * @param aAllow whether to allow access.
060: * @param aLocalOnly whether guard is to be applied locally only
061: * @param aClassName the class to apply guard on.
062: */
063: Guard(final boolean aAllow, final boolean aLocalOnly,
064: final String aClassName) {
065: mAllowed = aAllow;
066: mLocalOnly = aLocalOnly;
067: mPkgName = null;
068: mClassName = aClassName;
069: mExactMatch = true; // not used.
070: }
071:
072: /**
073: * Verifies whether a package name be used.
074: * @param aForImport the package to check.
075: * @return a result {@link AccessResult} indicating whether it can be used.
076: */
077: AccessResult verifyImport(final String aForImport) {
078: assert aForImport != null;
079: if (mClassName != null) {
080: final boolean classMatch = mClassName.equals(aForImport);
081: return calculateResult(classMatch);
082: }
083:
084: // Must be checking a package. First check that we actually match
085: // the package. Then check if matched and we must be an exact match.
086: // In this case, the text after the first "." must not contain
087: // another "." as this indicates that it is not an exact match.
088: assert mPkgName != null;
089: //boolean pkgMatch = aForImport.startsWith(mPkgName + ".");
090: boolean pkgMatch = aForImport.startsWith(mPkgName + ".");
091: if (pkgMatch && mExactMatch) {
092: pkgMatch = (aForImport
093: .indexOf('.', (mPkgName.length() + 1)) == -1);
094: }
095: return calculateResult(pkgMatch);
096: }
097:
098: /**
099: * @return returns whether the guard is to only be applied locally.
100: */
101: boolean isLocalOnly() {
102: return mLocalOnly;
103: }
104:
105: /**
106: * Returns the appropriate {@link AccessResult} based on whether there
107: * was a match and if the guard is to allow access.
108: * @param aMatched indicates whether there was a match.
109: * @return An appropriate {@link AccessResult}.
110: */
111: private AccessResult calculateResult(final boolean aMatched) {
112: if (aMatched) {
113: return mAllowed ? AccessResult.ALLOWED
114: : AccessResult.DISALLOWED;
115: }
116: return AccessResult.UNKNOWN;
117: }
118: }
|