/*******************************************************************************
* Copyright (c) 2008, 2011 Obeo.
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.eef.runtime.impl.utils;
import org.eclipse.jdt.core.search.SearchPattern;
/**
* @author <a href="mailto:nathalie.lepine@obeo.fr">Nathalie Lepine</a>
*/
public class PatternTool {
/**
* @param text
* : the element name
* @param pattern
* @return if name match the pattern
*/
public static boolean getPattern(String text, String pattern) {
if (text == null) {
return false;
}
if (pattern == null || "".equals(pattern)) { //$NON-NLS-1$
return true;
}
PatternMatcher fNameMatcher = new PatternMatcher(pattern, true);
return fNameMatcher.matches(text);
}
private static class PatternMatcher {
private String fPattern;
private int fMatchKind;
private StringMatcher fStringMatcher;
private static final char END_SYMBOL = '<';
private static final char ANY_STRING = '*';
private static final char BLANK = ' ';
public PatternMatcher(String pattern, boolean ignoreCase) {
this(pattern, SearchPattern.R_EXACT_MATCH | SearchPattern.R_PREFIX_MATCH
| SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CAMELCASE_MATCH);
}
public PatternMatcher(String pattern, int allowedModes) {
initializePatternAndMatchKind(pattern);
fMatchKind = fMatchKind & allowedModes;
if (fMatchKind == SearchPattern.R_PATTERN_MATCH) {
fStringMatcher = new StringMatcher(fPattern, true, false);
}
}
public String getPattern() {
return fPattern;
}
public int getMatchKind() {
return fMatchKind;
}
public boolean matches(String text) {
switch (fMatchKind) {
case SearchPattern.R_PATTERN_MATCH:
return fStringMatcher.match(text);
case SearchPattern.R_EXACT_MATCH:
return fPattern.equalsIgnoreCase(text);
case SearchPattern.R_CAMELCASE_MATCH:
if (SearchPattern.camelCaseMatch(fPattern, text)) {
return true;
}
// fall through to prefix match if camel case failed (bug
// 137244)
default:
return startsWithIgnoreCase(text, fPattern);
}
}
public static boolean startsWithIgnoreCase(String text, String prefix) {
int textLength = text.length();
int prefixLength = prefix.length();
if (textLength < prefixLength)
return false;
for (int i = prefixLength - 1; i >= 0; i--) {
if (Character.toLowerCase(prefix.charAt(i)) != Character.toLowerCase(text.charAt(i)))
return false;
}
return true;
}
private void initializePatternAndMatchKind(String pattern) {
int length = pattern.length();
if (length == 0) {
fMatchKind = SearchPattern.R_EXACT_MATCH;
fPattern = pattern;
return;
}
char last = pattern.charAt(length - 1);
if (pattern.indexOf('*') != -1 || pattern.indexOf('?') != -1) {
fMatchKind = SearchPattern.R_PATTERN_MATCH;
switch (last) {
case END_SYMBOL:
fPattern = pattern.substring(0, length - 1);
break;
case BLANK:
fPattern = pattern.trim();
break;
case ANY_STRING:
fPattern = pattern;
break;
default:
fPattern = pattern + ANY_STRING;
}
return;
}
if (last == END_SYMBOL) {
fMatchKind = SearchPattern.R_EXACT_MATCH;
fPattern = pattern.substring(0, length - 1);
return;
}
if (last == BLANK) {
fMatchKind = SearchPattern.R_EXACT_MATCH;
fPattern = pattern.trim();
return;
}
if (isCamelCasePattern(pattern)) {
fMatchKind = SearchPattern.R_CAMELCASE_MATCH;
fPattern = pattern;
return;
}
fMatchKind = SearchPattern.R_PREFIX_MATCH;
fPattern = pattern;
}
/**
* Returns whether the given pattern is a camel case pattern or not.
*
* @param pattern
* the pattern to inspect
* @return whether it is a camel case pattern or not
*/
public static boolean isCamelCasePattern(String pattern) {
return SearchPattern.validateMatchRule(pattern, SearchPattern.R_CAMELCASE_MATCH) == SearchPattern.R_CAMELCASE_MATCH;
}
}
}