scolebourne 2004/11/21 17:11:56 Modified: io/src/java/org/apache/commons/io FilenameUtils.java Log: Add commented out implementations of prefix handling, Javadoc Revision Changes Path 1.26 +218 -17 jakarta-commons/io/src/java/org/apache/commons/io/FilenameUtils.java Index: FilenameUtils.java =================================================================== RCS file: /home/cvs/jakarta-commons/io/src/java/org/apache/commons/io/FilenameUtils.java,v retrieving revision 1.25 retrieving revision 1.26 diff -u -r1.25 -r1.26 --- FilenameUtils.java 31 Oct 2004 04:17:34 -0000 1.25 +++ FilenameUtils.java 22 Nov 2004 01:11:55 -0000 1.26 @@ -23,9 +23,10 @@ /** * Utility class that provides methods to manipulate filenames and filepaths. * <p> - * This class defines three basic components within a filename (example C:\dev\file.txt): + * This class defines four basic components within a filename (example C:\dev\project\file.txt): * <ul> - * <li>the path - C:\dev + * <li>the prefix - C:\ + * <li>the path - dev\project * <li>the name - file.txt * <li>the extension - txt * </ul> @@ -90,11 +91,119 @@ */ private static final char SYSTEM_SEPARATOR = File.separatorChar; +// /** +// * The separator character that is the opposite of the system separator. +// */ +// private static final char OTHER_SEPARATOR; +// static { +// if (SYSTEM_SEPARATOR == WINDOWS_SEPARATOR) { +// OTHER_SEPARATOR = UNIX_SEPARATOR; +// } else { +// OTHER_SEPARATOR = WINDOWS_SEPARATOR; +// } +// } + /** * Instances should NOT be constructed in standard programming. */ public FilenameUtils() { } +// //----------------------------------------------------------------------- +// /** +// * Checks if the character is a separator. +// * +// * @param ch the character to check +// * @return true if it is a separators +// */ +// private static boolean isSeparator(char ch) { +// return (ch == UNIX_SEPARATOR) || (ch == WINDOWS_SEPARATOR); +// } +// +// //----------------------------------------------------------------------- +// /** +// * Normalizes a path, removing double and single dot path steps. +// * <p> +// * This method normalizes a path to a standard format. +// * The input may contain separators in either Unix or Windows format. +// * The output will contain separators in the format of the system. +// * <p> +// * A double slash will be merged to a single slash (thus UNC names are not handled). +// * A single dot path segment will be removed with no other effect. +// * A double dot will cause that path segment and the one before to be removed. +// * If the double dot has no parent path segment to work with, <code>null</code> +// * is returned. +// * <pre> +// * /foo// --> /foo/ +// * /foo/./ --> /foo/ +// * /foo/../bar --> /bar +// * /foo/../bar/ --> /bar/ +// * /foo/../bar/../baz --> /baz +// * //foo//./bar --> /foo/bar +// * /../ --> null +// * ../foo --> null +// * foo/../../bar --> null +// * foo/../bar --> bar +// * </pre> +// * +// * @param path the path to normalize, null returns null +// * @return the normalized String, or null if too many ..'s. +// * @todo prefixes for Windows +// */ +// public static String normalize(String path) { +// if (path == null) { +// return null; +// } +// char[] array = path.toCharArray(); +// int size = array.length; +// // fix separators +// for (int i = 0; i < array.length; i++) { +// if (array[i] == OTHER_SEPARATOR) { +// array[i] = SYSTEM_SEPARATOR; +// } +// } +// // adjoining slashes +// for (int i = 1; i < size; i++) { +// if (array[i] == SYSTEM_SEPARATOR && array[i - 1] == SYSTEM_SEPARATOR) { +// System.arraycopy(array, i, array, i - 1, size - i); +// size--; +// i--; +// } +// } +// // dot slash +// for (int i = 2; i < size; i++) { +// if (array[i] == SYSTEM_SEPARATOR && array[i - 1] == '.' && +// array[i - 2] == SYSTEM_SEPARATOR) { +// System.arraycopy(array, i, array, i - 2, size - i); +// size -=2; +// i--; +// } +// } +// // double dot slash +// outer: +// for (int i = 2; i < size; i++) { +// if (array[i] == SYSTEM_SEPARATOR && array[i - 1] == '.' && +// array[i - 2] == '.' && (i == 2 || array[i - 3] == SYSTEM_SEPARATOR)) { +// if (i == 2) { +// return null; +// } +// int j; +// for (j = i - 4 ; j >= 0; j--) { +// if (array[j] == SYSTEM_SEPARATOR) { +// System.arraycopy(array, i, array, j, size - i); +// size -= (i - j); +// i = j + 1; +// continue outer; +// } +// } +// System.arraycopy(array, i + 1, array, 0, size - i - 1); +// size -= (i + 1); +// i = 1; +// } +// } +// +// return new String(array, 0, size); +// } + //----------------------------------------------------------------------- /** * Normalize a path. @@ -322,6 +431,62 @@ } //----------------------------------------------------------------------- +// /** +// * Returns the length of the filename prefix, such as <code>C:/</code> or <code>~/</code>. +// * <p> +// * This method will handle a file in either Unix or Windows format. +// * The prefix includes the first slash in the full filename. +// * <pre> +// * Windows: +// * a\b\c.txt --> "" --> relative +// * \a\b\c.txt --> "\" --> drive relative +// * C:\a\b\c.txt --> "C:\" --> absolute +// * \\server\a\b\c.txt --> "\\server\" --> UNC +// * +// * Unix: +// * a/b/c.txt --> "" --> relative +// * /a/b/c.txt --> "/" --> absolute +// * ~/a/b/c.txt --> "~/" --> current user relative +// * ~user/a/b/c.txt --> "~user/" --> named user relative +// * </pre> +// * +// * @param filename the filename to find the prefix in, null returns -1 +// * @return the length of the prefix, -1 if invalid or null +// */ +// public static int getPrefixLength(String filename) { +// if (filename == null) { +// return -1; +// } +// int len = filename.length(); +// if (len == 0) { +// return 0; +// } +// if (SYSTEM_SEPARATOR == WINDOWS_SEPARATOR) { +// char ch0 = filename.charAt(0); +// if (len == 1) { +// return (isSeparator(ch0) ? 1 : 0); +// } else { +// char ch1 = filename.charAt(1); +// if (ch1 == ':') { +// ch0 = Character.toUpperCase(ch0); +// if (ch0 < 'A' || ch0 > 'Z' || len == 2 || isSeparator(filename.charAt(2)) == false) { +// return -1; +// } +// return 3; +// } else if (isSeparator(ch0) && isSeparator(ch1)) { +// int pos = Math.min( +// filename.indexOf(UNIX_SEPARATOR, 2), +// filename.indexOf(WINDOWS_SEPARATOR, 2)); +// return (pos == -1 || pos == 2 ? -1 : pos + 1); +// } else { +// return (isSeparator(ch0) ? 1 : 0); +// } +// } +// } else { +// } +// return 0; +// } + /** * Returns the index of the last directory separator character. * <p> @@ -330,7 +495,7 @@ * * @param filename the filename to find the last path separator in, null returns -1 * @return the index of the last separator character, or -1 if there - * is no such character. + * is no such character */ public static int indexOfLastSeparator(String filename) { if (filename == null) { @@ -350,7 +515,7 @@ * * @param filename the filename to find the last path separator in, null returns -1 * @return the index of the last separator character, or -1 if there - * is no such character. + * is no such character */ public static int indexOfExtension(String filename) { if (filename == null) { @@ -362,6 +527,39 @@ } //----------------------------------------------------------------------- +// /** +// * Gets the prefix from a full filename, such as <code>C:/</code> or <code>~/</code>. +// * <p> +// * This method will handle a file in either Unix or Windows format. +// * The prefix includes the first slash in the full filename. +// * <pre> +// * Windows: +// * a\b\c.txt --> "" --> relative +// * \a\b\c.txt --> "\" --> drive relative +// * C:\a\b\c.txt --> "C:\" --> absolute +// * \\server\a\b\c.txt --> "\\server\" --> UNC +// * +// * Unix: +// * a/b/c.txt --> "" --> relative +// * /a/b/c.txt --> "/" --> absolute +// * ~/a/b/c.txt --> "~/" --> current user relative +// * ~user/a/b/c.txt --> "~user/" --> named user relative +// * </pre> +// * +// * @param filename the filename to query, null returns null +// * @return the prefix of the file, null if invalid +// */ +// public static String getPrefix(String filename) { +// if (filename == null) { +// return null; +// } +// int len = getPrefixLength(filename); +// if (len < 0) { +// return null; +// } +// return filename.substring(0, len); +// } + /** * Gets the path from a full filename. * <p> @@ -553,11 +751,16 @@ return isExtension(filename, array); } + //----------------------------------------------------------------------- /** * See if a particular piece of text, often a filename, * matches to a specified wildcard, as seen on DOS/UNIX command lines. + * + * @param filename the filename to match on + * @param wildcard the wildcard string to match against + * @return true if the filename matches the wilcard string */ - public static boolean wildcardMatch(String text, String wildcard) { + public static boolean wildcardMatch(String filename, String wildcard) { String[] wcs = splitOnTokens(wildcard); int textIdx = 0; @@ -565,17 +768,16 @@ boolean anyChars = false; // loop whilst tokens and text left to process - while (wcsIdx < wcs.length && textIdx < text.length()) { + while (wcsIdx < wcs.length && textIdx < filename.length()) { // ? so move to next text char if (wcs[wcsIdx].equals("?")) { textIdx++; - } else - if (!wcs[wcsIdx].equals("*")) { + } else if (!wcs[wcsIdx].equals("*")) { // matching text token if (anyChars) { // any chars then try to locate text token - textIdx = text.indexOf(wcs[wcsIdx], textIdx); + textIdx = filename.indexOf(wcs[wcsIdx], textIdx); if (textIdx == -1) { // token not found @@ -583,7 +785,7 @@ } } else { // matching from current position - if (!text.startsWith(wcs[wcsIdx], textIdx)) { + if (!filename.startsWith(wcs[wcsIdx], textIdx)) { // couldnt match token return false; } @@ -608,12 +810,12 @@ } // ran out of text chars - if (textIdx > text.length()) { + if (textIdx > filename.length()) { return false; } // didnt match all text chars, only ok if any chars set - if (textIdx < text.length() && !anyChars) { + if (textIdx < filename.length() && !anyChars) { return false; } @@ -624,13 +826,13 @@ // package level so a unit test may run on this static String[] splitOnTokens(String text) { char[] array = text.toCharArray(); - if(text.indexOf("?") == -1 && text.indexOf("*") == -1) { + if (text.indexOf("?") == -1 && text.indexOf("*") == -1) { return new String[] { text }; } ArrayList list = new ArrayList(); StringBuffer buffer = new StringBuffer(); - for(int i=0; i<array.length; i++) { + for (int i = 0; i < array.length; i++) { if(array[i] == '?' || array[i] == '*') { if(buffer.length() != 0) { list.add(buffer.toString()); @@ -641,12 +843,11 @@ buffer.append(array[i]); } } - if(buffer.length() != 0) { + if (buffer.length() != 0) { list.add(buffer.toString()); } return (String[]) list.toArray(new String[0]); } - }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]