blob: 0976111d03131b4b779b14e3a5cd7ec28740a744 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 IBM Corporation and others.
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// which accompanies this distribution, and is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// Contributors:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.search.ui.internal;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
/**
* Pattern contructor for a method search.
*
* @author Kelvin Low
* @since 1.0
*/
public class MethodSearchPattern {
/**
* Private constructor to prevent this class from being instantiated. All
* methods in this class should be static.
*/
private MethodSearchPattern() {
}
/**
* Creates a
* <code>Pattern<code> object from the pattern string used in Method Search.
*
* @param pattern
* a search pattern string
* @param isCaseSensitive
* if <code>true</code>, create a case insensitve pattern
* @param isRegexSearch
* if <code>true</code>, treat the pattern as a regular expression pattern
* @return a new <code>Pattern<code> object
* @throws <code>PatternSyntaxException</code> if the specified pattern has a syntax error
*/
public static Pattern createPattern(String pattern,
boolean isCaseSensitive, boolean isRegexSearch)
throws PatternSyntaxException {
if (!isRegexSearch) {
pattern = toRegexPattern(pattern);
}
if (!isCaseSensitive) {
return Pattern.compile(pattern, Pattern.CASE_INSENSITIVE
| Pattern.UNICODE_CASE | Pattern.MULTILINE);
}
return Pattern.compile(pattern, Pattern.MULTILINE);
}
/**
* Converts a pattern string with '*' and '?' into a regular expression
* pattern string.
*
* @param pattern
* a pattern string
* @return a regular expression pattern string
*/
private static String toRegexPattern(String pattern) {
int patternLength = pattern.length();
StringBuffer result = new StringBuffer(patternLength);
boolean escaped = false;
boolean quoting = false;
for (int i = 0; i < patternLength; i++) {
char ch = pattern.charAt(i);
switch (ch) {
case '*':
if (!escaped) {
if (quoting) {
result.append("\\E"); //$NON-NLS-1$
quoting = false;
}
}
result.append(".*"); //$NON-NLS-1$
escaped = false;
break;
case '?':
if (!escaped) {
if (quoting) {
result.append("\\E"); //$NON-NLS-1$
quoting = false;
}
}
result.append("."); //$NON-NLS-1$
escaped = false;
break;
case '\\':
if (!escaped) {
escaped = true;
} else {
escaped = false;
if (quoting) {
result.append("\\E"); //$NON-NLS-1$
quoting = false;
}
result.append("\\\\"); //$NON-NLS-1$
}
break;
default:
if (!quoting) {
result.append("\\Q"); //$NON-NLS-1$
quoting = true;
}
if (escaped && ch != '*' && ch != '?' && ch != '\\') {
result.append('\\');
}
result.append(ch);
escaped = (ch == '\\');
}
}
if (quoting) {
result.append("\\E"); //$NON-NLS-1$
}
return result.toString();
}
}