⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 selectorutils.java

📁 Use the links below to download a source distribution of Ant from one of our mirrors. It is good pra
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* *  Licensed to the Apache Software Foundation (ASF) under one or more *  contributor license agreements.  See the NOTICE file distributed with *  this work for additional information regarding copyright ownership. *  The ASF licenses this file to You under the Apache License, Version 2.0 *  (the "License"); you may not use this file except in compliance with *  the License.  You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * *  Unless required by applicable law or agreed to in writing, software *  distributed under the License is distributed on an "AS IS" BASIS, *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *  See the License for the specific language governing permissions and *  limitations under the License. * */package org.apache.tools.ant.types.selectors;import java.io.File;import java.util.StringTokenizer;import java.util.Vector;import org.apache.tools.ant.types.Resource;import org.apache.tools.ant.util.FileUtils;import org.apache.tools.ant.types.resources.FileResource;/** * <p>This is a utility class used by selectors and DirectoryScanner. The * functionality more properly belongs just to selectors, but unfortunately * DirectoryScanner exposed these as protected methods. Thus we have to * support any subclasses of DirectoryScanner that may access these methods. * </p> * <p>This is a Singleton.</p> * * @since 1.5 */public final class SelectorUtils {    private static SelectorUtils instance = new SelectorUtils();    private static final FileUtils FILE_UTILS = FileUtils.getFileUtils();    /**     * Private Constructor     */    private SelectorUtils() {    }    /**     * Retrieves the instance of the Singleton.     * @return singleton instance     */    public static SelectorUtils getInstance() {        return instance;    }    /**     * Tests whether or not a given path matches the start of a given     * pattern up to the first "**".     * <p>     * This is not a general purpose test and should only be used if you     * can live with false positives. For example, <code>pattern=**\a</code>     * and <code>str=b</code> will yield <code>true</code>.     *     * @param pattern The pattern to match against. Must not be     *                <code>null</code>.     * @param str     The path to match, as a String. Must not be     *                <code>null</code>.     *     * @return whether or not a given path matches the start of a given     * pattern up to the first "**".     */    public static boolean matchPatternStart(String pattern, String str) {        return matchPatternStart(pattern, str, true);    }    /**     * Tests whether or not a given path matches the start of a given     * pattern up to the first "**".     * <p>     * This is not a general purpose test and should only be used if you     * can live with false positives. For example, <code>pattern=**\a</code>     * and <code>str=b</code> will yield <code>true</code>.     *     * @param pattern The pattern to match against. Must not be     *                <code>null</code>.     * @param str     The path to match, as a String. Must not be     *                <code>null</code>.     * @param isCaseSensitive Whether or not matching should be performed     *                        case sensitively.     *     * @return whether or not a given path matches the start of a given     * pattern up to the first "**".     */    public static boolean matchPatternStart(String pattern, String str,                                            boolean isCaseSensitive) {        // When str starts with a File.separator, pattern has to start with a        // File.separator.        // When pattern starts with a File.separator, str has to start with a        // File.separator.        if (str.startsWith(File.separator)                != pattern.startsWith(File.separator)) {            return false;        }        String[] patDirs = tokenizePathAsArray(pattern);        String[] strDirs = tokenizePathAsArray(str);        int patIdxStart = 0;        int patIdxEnd = patDirs.length - 1;        int strIdxStart = 0;        int strIdxEnd = strDirs.length - 1;        // up to first '**'        while (patIdxStart <= patIdxEnd && strIdxStart <= strIdxEnd) {            String patDir = patDirs[patIdxStart];            if (patDir.equals("**")) {                break;            }            if (!match(patDir, strDirs[strIdxStart], isCaseSensitive)) {                return false;            }            patIdxStart++;            strIdxStart++;        }        // CheckStyle:SimplifyBooleanReturnCheck OFF        // Check turned off as the code needs the comments for the various        // code paths.        if (strIdxStart > strIdxEnd) {            // String is exhausted            return true;        } else if (patIdxStart > patIdxEnd) {            // String not exhausted, but pattern is. Failure.            return false;        } else {            // pattern now holds ** while string is not exhausted            // this will generate false positives but we can live with that.            return true;        }    }    /**     * Tests whether or not a given path matches a given pattern.     *     * @param pattern The pattern to match against. Must not be     *                <code>null</code>.     * @param str     The path to match, as a String. Must not be     *                <code>null</code>.     *     * @return <code>true</code> if the pattern matches against the string,     *         or <code>false</code> otherwise.     */    public static boolean matchPath(String pattern, String str) {        return matchPath(pattern, str, true);    }    /**     * Tests whether or not a given path matches a given pattern.     *     * @param pattern The pattern to match against. Must not be     *                <code>null</code>.     * @param str     The path to match, as a String. Must not be     *                <code>null</code>.     * @param isCaseSensitive Whether or not matching should be performed     *                        case sensitively.     *     * @return <code>true</code> if the pattern matches against the string,     *         or <code>false</code> otherwise.     */    public static boolean matchPath(String pattern, String str,                                    boolean isCaseSensitive) {        String[] patDirs = tokenizePathAsArray(pattern);        String[] strDirs = tokenizePathAsArray(str);        int patIdxStart = 0;        int patIdxEnd = patDirs.length - 1;        int strIdxStart = 0;        int strIdxEnd = strDirs.length - 1;        // up to first '**'        while (patIdxStart <= patIdxEnd && strIdxStart <= strIdxEnd) {            String patDir = patDirs[patIdxStart];            if (patDir.equals("**")) {                break;            }            if (!match(patDir, strDirs[strIdxStart], isCaseSensitive)) {                patDirs = null;                strDirs = null;                return false;            }            patIdxStart++;            strIdxStart++;        }        if (strIdxStart > strIdxEnd) {            // String is exhausted            for (int i = patIdxStart; i <= patIdxEnd; i++) {                if (!patDirs[i].equals("**")) {                    patDirs = null;                    strDirs = null;                    return false;                }            }            return true;        } else {            if (patIdxStart > patIdxEnd) {                // String not exhausted, but pattern is. Failure.                patDirs = null;                strDirs = null;                return false;            }        }        // up to last '**'        while (patIdxStart <= patIdxEnd && strIdxStart <= strIdxEnd) {            String patDir = patDirs[patIdxEnd];            if (patDir.equals("**")) {                break;            }            if (!match(patDir, strDirs[strIdxEnd], isCaseSensitive)) {                patDirs = null;                strDirs = null;                return false;            }            patIdxEnd--;            strIdxEnd--;        }        if (strIdxStart > strIdxEnd) {            // String is exhausted            for (int i = patIdxStart; i <= patIdxEnd; i++) {                if (!patDirs[i].equals("**")) {                    patDirs = null;                    strDirs = null;                    return false;                }            }            return true;        }        while (patIdxStart != patIdxEnd && strIdxStart <= strIdxEnd) {            int patIdxTmp = -1;            for (int i = patIdxStart + 1; i <= patIdxEnd; i++) {                if (patDirs[i].equals("**")) {                    patIdxTmp = i;                    break;                }            }            if (patIdxTmp == patIdxStart + 1) {                // '**/**' situation, so skip one                patIdxStart++;                continue;            }            // Find the pattern between padIdxStart & padIdxTmp in str between            // strIdxStart & strIdxEnd            int patLength = (patIdxTmp - patIdxStart - 1);            int strLength = (strIdxEnd - strIdxStart + 1);            int foundIdx = -1;            strLoop:                        for (int i = 0; i <= strLength - patLength; i++) {                            for (int j = 0; j < patLength; j++) {                                String subPat = patDirs[patIdxStart + j + 1];                                String subStr = strDirs[strIdxStart + i + j];                                if (!match(subPat, subStr, isCaseSensitive)) {                                    continue strLoop;                                }                            }                            foundIdx = strIdxStart + i;                            break;                        }            if (foundIdx == -1) {                patDirs = null;                strDirs = null;                return false;            }            patIdxStart = patIdxTmp;            strIdxStart = foundIdx + patLength;        }        for (int i = patIdxStart; i <= patIdxEnd; i++) {            if (!patDirs[i].equals("**")) {                patDirs = null;                strDirs = null;                return false;            }        }        return true;    }    /**     * Tests whether or not a string matches against a pattern.     * The pattern may contain two special characters:<br>     * '*' means zero or more characters<br>     * '?' means one and only one character     *     * @param pattern The pattern to match against.     *                Must not be <code>null</code>.     * @param str     The string which must be matched against the pattern.     *                Must not be <code>null</code>.     *     * @return <code>true</code> if the string matches against the pattern,     *         or <code>false</code> otherwise.     */    public static boolean match(String pattern, String str) {        return match(pattern, str, true);    }    /**     * Tests whether or not a string matches against a pattern.     * The pattern may contain two special characters:<br>     * '*' means zero or more characters<br>     * '?' means one and only one character     *     * @param pattern The pattern to match against.     *                Must not be <code>null</code>.     * @param str     The string which must be matched against the pattern.     *                Must not be <code>null</code>.     * @param isCaseSensitive Whether or not matching should be performed     *                        case sensitively.     *     *     * @return <code>true</code> if the string matches against the pattern,     *         or <code>false</code> otherwise.     */    public static boolean match(String pattern, String str,                                boolean isCaseSensitive) {        char[] patArr = pattern.toCharArray();        char[] strArr = str.toCharArray();        int patIdxStart = 0;        int patIdxEnd = patArr.length - 1;        int strIdxStart = 0;        int strIdxEnd = strArr.length - 1;        char ch;        boolean containsStar = false;        for (int i = 0; i < patArr.length; i++) {            if (patArr[i] == '*') {                containsStar = true;                break;            }        }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -