diff --git a/src/checkstyle/com/puppycrawl/tools/checkstyle/Checker.java b/src/checkstyle/com/puppycrawl/tools/checkstyle/Checker.java index 82c5fc11c..b4ae873f6 100644 --- a/src/checkstyle/com/puppycrawl/tools/checkstyle/Checker.java +++ b/src/checkstyle/com/puppycrawl/tools/checkstyle/Checker.java @@ -19,9 +19,12 @@ package com.puppycrawl.tools.checkstyle; import java.io.File; + import java.util.ArrayList; import java.util.Iterator; import java.util.Locale; +import java.util.Stack; +import java.util.StringTokenizer; import com.puppycrawl.tools.checkstyle.api.AuditEvent; import com.puppycrawl.tools.checkstyle.api.AuditListener; @@ -36,8 +39,6 @@ import com.puppycrawl.tools.checkstyle.api.LocalizedMessage; import com.puppycrawl.tools.checkstyle.api.MessageDispatcher; import com.puppycrawl.tools.checkstyle.api.SeverityLevel; -import org.apache.tools.ant.util.FileUtils; - /** * This class provides the functionality to check a set of files. * @author Oliver Burn @@ -296,8 +297,148 @@ public class Checker extends AutomaticBean // we use getAbsolutePath() instead of getCanonicalPath() // because normalize() removes all . and .. so path // will be canonical by default. - mBasedir = - FileUtils.newFileUtils().normalize(aBasedir).getAbsolutePath(); + mBasedir = normalize(aBasedir); + } + + /** + * "normalize" the given absolute path. + * + *

This includes: + *

+ * + * @param aPath a path for "normalizing" + * @return "normalized" file name + * @throws java.lang.NullPointerException if the file path is + * equal to null. + */ + public String normalize(String aPath) + { + final String osName = + System.getProperty("os.name").toLowerCase(Locale.US); + final boolean onNetWare = (osName.indexOf("netware") > -1); + + String orig = aPath; + + aPath = aPath.replace('/', File.separatorChar) + .replace('\\', File.separatorChar); + + // make sure we are dealing with an absolute path + int colon = aPath.indexOf(":"); + + if (!onNetWare) { + if (!aPath.startsWith(File.separator) + && !(aPath.length() >= 2 + && Character.isLetter(aPath.charAt(0)) + && colon == 1)) + { + String msg = aPath + " is not an absolute path"; + throw new IllegalArgumentException(msg); + } + } + else { + if (!aPath.startsWith(File.separator) + && (colon == -1)) + { + String msg = aPath + " is not an absolute path"; + throw new IllegalArgumentException(msg); + } + } + + boolean dosWithDrive = false; + String root = null; + // Eliminate consecutive slashes after the drive spec + if ((!onNetWare + && aPath.length() >= 2 + && Character.isLetter(aPath.charAt(0)) + && aPath.charAt(1) == ':') + || (onNetWare && colon > -1)) + { + + dosWithDrive = true; + + char[] ca = aPath.replace('/', '\\').toCharArray(); + StringBuffer sbRoot = new StringBuffer(); + for (int i = 0; i < colon; i++) { + sbRoot.append(Character.toUpperCase(ca[i])); + } + sbRoot.append(':'); + if (colon + 1 < aPath.length()) { + sbRoot.append(File.separatorChar); + } + root = sbRoot.toString(); + + // Eliminate consecutive slashes after the drive spec + StringBuffer sbPath = new StringBuffer(); + for (int i = colon + 1; i < ca.length; i++) { + if ((ca[i] != '\\') + || (ca[i] == '\\' && ca[i - 1] != '\\')) + { + sbPath.append(ca[i]); + } + } + aPath = sbPath.toString().replace('\\', File.separatorChar); + + } + else { + if (aPath.length() == 1) { + root = File.separator; + aPath = ""; + } + else if (aPath.charAt(1) == File.separatorChar) { + // UNC drive + root = File.separator + File.separator; + aPath = aPath.substring(2); + } + else { + root = File.separator; + aPath = aPath.substring(1); + } + } + + Stack s = new Stack(); + s.push(root); + StringTokenizer tok = new StringTokenizer(aPath, File.separator); + while (tok.hasMoreTokens()) { + String thisToken = tok.nextToken(); + if (".".equals(thisToken)) { + continue; + } + else if ("..".equals(thisToken)) { + if (s.size() < 2) { + throw new IllegalArgumentException("Cannot resolve path " + + orig); + } + else { + s.pop(); + } + } + else { // plain component + s.push(thisToken); + } + } + + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < s.size(); i++) { + if (i > 1) { + // not before the filesystem root and not after it, since root + // already contains one + sb.append(File.separatorChar); + } + sb.append(s.elementAt(i)); + } + + + aPath = sb.toString(); + if (dosWithDrive) { + aPath = aPath.replace('/', '\\'); + } + return aPath; } /** @return the base directory property used in unit-test. */