Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareFilter.java')
-rw-r--r--bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareFilter.java397
1 files changed, 0 insertions, 397 deletions
diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareFilter.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareFilter.java
deleted file mode 100644
index abcea3bae..000000000
--- a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/CompareFilter.java
+++ /dev/null
@@ -1,397 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.compare.internal;
-
-import java.text.MessageFormat;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.resources.*;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.runtime.IStatus;
-
-
-public class CompareFilter {
- private static final char[][] NO_CHAR_CHAR= new char[0][];
-
- private char[][] fExtraResourceFileFilters;
- private String[] fExtraResourceFolderFilters;
-
-
- public CompareFilter() {
- // nothing to do
- }
-
- /*
- * Returns true if path matches filter, that is if path should be filtered.
- */
- public boolean filter(String path0, boolean folder, boolean isArchive) {
- if (!folder && fExtraResourceFileFilters != null) {
- char[] name= path0.toCharArray();
- for (int i= 0, l= fExtraResourceFileFilters.length; i < l; i++)
- if (match(fExtraResourceFileFilters[i], name, true))
- return true;
- }
- if (folder && fExtraResourceFolderFilters != null) {
- for (int i= 0, l= fExtraResourceFolderFilters.length; i < l; i++)
- if (fExtraResourceFolderFilters[0].equals(path0))
- return true;
- }
- return false;
- }
-
- public static String validateResourceFilters(String text) {
- IWorkspace workspace= ResourcesPlugin.getWorkspace();
- String[] filters= getTokens(text, ","); //$NON-NLS-1$
- for (int i= 0; i < filters.length; i++) {
- String fileName= filters[i].replace('*', 'x');
- int resourceType= IResource.FILE;
- int lastCharacter= fileName.length() - 1;
- if (lastCharacter >= 0 && fileName.charAt(lastCharacter) == '/') {
- fileName= fileName.substring(0, lastCharacter);
- resourceType= IResource.FOLDER;
- }
- IStatus status= workspace.validateName(fileName, resourceType);
- if (status.matches(IStatus.ERROR)) {
- String format= Utilities.getString("ComparePreferencePage.filter.invalidsegment.error"); //$NON-NLS-1$
- return MessageFormat.format(format, new String[] { status.getMessage() } );
- }
- }
- return null;
- }
-
- public void setFilters(String filterSequence) {
- char[][] filters= filterSequence != null && filterSequence.length() > 0
- ? splitAndTrimOn(',', filterSequence.toCharArray())
- : null;
- if (filters == null) {
- fExtraResourceFileFilters= null;
- fExtraResourceFolderFilters= null;
- } else {
- int fileCount= 0, folderCount= 0;
- for (int i= 0, l= filters.length; i < l; i++) {
- char[] f= filters[i];
- if (f.length == 0)
- continue;
- if (f[f.length - 1] == '/')
- folderCount++;
- else
- fileCount++;
- }
- fExtraResourceFileFilters= new char[fileCount][];
- fExtraResourceFolderFilters= new String[folderCount];
- for (int i= 0, l= filters.length; i < l; i++) {
- char[] f= filters[i];
- if (f.length == 0)
- continue;
- if (f[f.length - 1] == '/')
- fExtraResourceFolderFilters[--folderCount]= new String(subarray(f, 0, f.length - 1));
- else
- fExtraResourceFileFilters[--fileCount]= f;
- }
- }
- }
-
- /////////
-
- private static String[] getTokens(String text, String separator) {
- StringTokenizer tok= new StringTokenizer(text, separator); //$NON-NLS-1$
- int nTokens= tok.countTokens();
- String[] res= new String[nTokens];
- for (int i= 0; i < res.length; i++)
- res[i]= tok.nextToken().trim();
- return res;
- }
-
- /**
- * Answers true if the pattern matches the given name, false otherwise.
- * This char[] pattern matching accepts wild-cards '*' and '?'.
- *
- * When not case sensitive, the pattern is assumed to already be
- * lowercased, the name will be lowercased character per character as
- * comparing. If name is null, the answer is false. If pattern is null, the
- * answer is true if name is not null. <br><br>For example:
- * <ol>
- * <li>
- *
- * <pre>
- * pattern = { '?', 'b', '*' } name = { 'a', 'b', 'c' , 'd' } isCaseSensitive = true result => true
- * </pre>
- *
- *
- * </li>
- * <li>
- *
- * <pre>
- * pattern = { '?', 'b', '?' } name = { 'a', 'b', 'c' , 'd' } isCaseSensitive = true result => false
- * </pre>
- *
- *
- * </li>
- * <li>
- *
- * <pre>
- * pattern = { 'b', '*' } name = { 'a', 'b', 'c' , 'd' } isCaseSensitive = true result => false
- * </pre>
- *
- *
- * </li>
- * </ol>
- *
- * @param pattern
- * the given pattern
- * @param name
- * the given name
- * @param isCaseSensitive
- * flag to know whether or not the matching should be case
- * sensitive
- * @return true if the pattern matches the given name, false otherwise
- */
- private boolean match(char[] pattern, char[] name, boolean isCaseSensitive) {
- if (name == null)
- return false; // null name cannot match
- if (pattern == null)
- return true; // null pattern is equivalent to '*'
- return match(pattern, 0, pattern.length, name, 0, name.length, isCaseSensitive);
- }
-
- /**
- * Answers true if the a sub-pattern matches the subpart of the given name,
- * false otherwise. char[] pattern matching, accepting wild-cards '*' and
- * '?'. Can match only subset of name/pattern. end positions are
- * non-inclusive. The subpattern is defined by the patternStart and
- * pattternEnd positions. When not case sensitive, the pattern is assumed
- * to already be lowercased, the name will be lowercased character per
- * character as comparing. <br><br>For example:
- * <ol>
- * <li>
- *
- * <pre>
- * pattern = { '?', 'b', '*' } patternStart = 1 patternEnd = 3 name = { 'a', 'b', 'c' , 'd' } nameStart = 1 nameEnd = 4 isCaseSensitive = true result => true
- * </pre>
- *
- *
- * </li>
- * <li>
- *
- * <pre>
- * pattern = { '?', 'b', '*' } patternStart = 1 patternEnd = 2 name = { 'a', 'b', 'c' , 'd' } nameStart = 1 nameEnd = 2 isCaseSensitive = true result => false
- * </pre>
- *
- *
- * </li>
- * </ol>
- *
- * @param pattern
- * the given pattern
- * @param patternStart
- * the given pattern start
- * @param patternEnd
- * the given pattern end
- * @param name
- * the given name
- * @param nameStart
- * the given name start
- * @param nameEnd
- * the given name end
- * @param isCaseSensitive
- * flag to know if the matching should be case sensitive
- * @return true if the a sub-pattern matches the subpart of the given name,
- * false otherwise
- */
- private boolean match(char[] pattern, int patternStart, int patternEnd, char[] name, int nameStart, int nameEnd,
- boolean isCaseSensitive) {
- if (name == null)
- return false; // null name cannot match
- if (pattern == null)
- return true; // null pattern is equivalent to '*'
- int iPattern= patternStart;
- int iName= nameStart;
- if (patternEnd < 0)
- patternEnd= pattern.length;
- if (nameEnd < 0)
- nameEnd= name.length;
- /* check first segment */
- char patternChar= 0;
- while ((iPattern < patternEnd) && (patternChar= pattern[iPattern]) != '*') {
- if (iName == nameEnd)
- return false;
- if (patternChar != (isCaseSensitive ? name[iName] : Character.toLowerCase(name[iName])) && patternChar != '?') {
- return false;
- }
- iName++;
- iPattern++;
- }
- /* check sequence of star+segment */
- int segmentStart;
- if (patternChar == '*') {
- segmentStart= ++iPattern; // skip star
- } else {
- segmentStart= 0; // force iName check
- }
- int prefixStart= iName;
- checkSegment : while (iName < nameEnd) {
- if (iPattern == patternEnd) {
- iPattern= segmentStart; // mismatch - restart current segment
- iName= ++prefixStart;
- continue checkSegment;
- }
- /* segment is ending */
- if ((patternChar= pattern[iPattern]) == '*') {
- segmentStart= ++iPattern; // skip start
- if (segmentStart == patternEnd) {
- return true;
- }
- prefixStart= iName;
- continue checkSegment;
- }
- /* check current name character */
- if ((isCaseSensitive ? name[iName] : Character.toLowerCase(name[iName])) != patternChar && patternChar != '?') {
- iPattern= segmentStart; // mismatch - restart current segment
- iName= ++prefixStart;
- continue checkSegment;
- }
- iName++;
- iPattern++;
- }
- return (segmentStart == patternEnd) || (iName == nameEnd && iPattern == patternEnd)
- || (iPattern == patternEnd - 1 && pattern[iPattern] == '*');
- }
-
- /**
- * Return a new array which is the split of the given array using the given
- * divider and triming each subarray to remove whitespaces equals to ' '.
- * <br><br>For example:
- * <ol>
- * <li>
- *
- * <pre>
- * divider = 'b' array = { 'a' , 'b', 'b', 'a', 'b', 'a' } result => { { 'a' }, { }, { 'a' }, { 'a' } }
- * </pre>
- *
- *
- * </li>
- * <li>
- *
- * <pre>
- * divider = 'c' array = { 'a' , 'b', 'b', 'a', 'b', 'a' } result => { { 'a', 'b', 'b', 'a', 'b', 'a' } }
- * </pre>
- *
- *
- * </li>
- * <li>
- *
- * <pre>
- * divider = 'b' array = { 'a' , ' ', 'b', 'b', 'a', 'b', 'a' } result => { { 'a' }, { }, { 'a' }, { 'a' } }
- * </pre>
- *
- *
- * </li>
- * <li>
- *
- * <pre>
- * divider = 'c' array = { ' ', ' ', 'a' , 'b', 'b', 'a', 'b', 'a', ' ' } result => { { 'a', 'b', 'b', 'a', 'b', 'a' } }
- * </pre>
- *
- *
- * </li>
- * </ol>
- *
- * @param divider
- * the given divider
- * @param array
- * the given array
- * @return a new array which is the split of the given array using the
- * given divider and triming each subarray to remove whitespaces
- * equals to ' '
- */
- private char[][] splitAndTrimOn(char divider, char[] array) {
- int length= array == null ? 0 : array.length;
- if (length == 0)
- return NO_CHAR_CHAR;
- int wordCount= 1;
- for (int i= 0; i < length; i++)
- if (array[i] == divider)
- wordCount++;
- char[][] split= new char[wordCount][];
- int last= 0, currentWord= 0;
- for (int i= 0; i < length; i++) {
- if (array[i] == divider) {
- int start= last, end= i - 1;
- while (start < i && array[start] == ' ')
- start++;
- while (end > start && array[end] == ' ')
- end--;
- split[currentWord]= new char[end - start + 1];
- System.arraycopy(array, start, split[currentWord++], 0, end - start + 1);
- last= i + 1;
- }
- }
- int start= last, end= length - 1;
- while (start < length && array[start] == ' ')
- start++;
- while (end > start && array[end] == ' ')
- end--;
- split[currentWord]= new char[end - start + 1];
- System.arraycopy(array, start, split[currentWord++], 0, end - start + 1);
- return split;
- }
-
- /**
- * Answers a new array which is a copy of the given array starting at the
- * given start and ending at the given end. The given start is inclusive
- * and the given end is exclusive. Answers null if start is greater than
- * end, if start is lower than 0 or if end is greater than the length of
- * the given array. If end equals -1, it is converted to the array length.
- * <br><br>For example:
- * <ol>
- * <li>
- *
- * <pre>
- * array = { 'a' , 'b' } start = 0 end = 1 result => { 'a' }
- * </pre>
- *
- *
- * </li>
- * <li>
- *
- * <pre>
- * array = { 'a', 'b' } start = 0 end = -1 result => { 'a' , 'b' }
- * </pre>
- *
- *
- * </li>
- * </ol>
- *
- * @param array
- * the given array
- * @param start
- * the given starting index
- * @param end
- * the given ending index
- * @return a new array which is a copy of the given array starting at the
- * given start and ending at the given end
- * @exception NullPointerException
- * if the given array is null
- */
- private char[] subarray(char[] array, int start, int end) {
- if (end == -1)
- end= array.length;
- if (start > end)
- return null;
- if (start < 0)
- return null;
- if (end > array.length)
- return null;
- char[] result= new char[end - start];
- System.arraycopy(array, start, result, 0, end - start);
- return result;
- }
-}

Back to the top