package co.codewizards.cloudstore.core.ignore;
import static co.codewizards.cloudstore.core.util.AssertUtil.*;
import java.util.regex.Pattern;
public class IgnoreRuleImpl implements IgnoreRule {
private String ignoreRuleId;
private String namePattern;
private String nameRegex;
private boolean enabled;
private boolean caseSensitive;
private Pattern nameRegexPattern;
public IgnoreRuleImpl() {
}
@Override
public String getIgnoreRuleId() {
return ignoreRuleId;
}
@Override
public void setIgnoreRuleId(String ignoreRuleId) {
this.ignoreRuleId = ignoreRuleId;
}
@Override
public String getNamePattern() {
return namePattern;
}
@Override
public void setNamePattern(String namePattern) {
this.namePattern = namePattern;
this.nameRegexPattern = null;
}
@Override
public String getNameRegex() {
return nameRegex;
}
@Override
public void setNameRegex(String nameRegex) {
this.nameRegex = nameRegex;
this.nameRegexPattern = null;
}
@Override
public boolean isEnabled() {
return enabled;
}
@Override
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
@Override
public boolean isCaseSensitive() {
return caseSensitive;
}
@Override
public void setCaseSensitive(boolean caseSensitive) {
this.caseSensitive = caseSensitive;
this.nameRegexPattern = null;
}
@Override
public Pattern getNameRegexPattern() {
if (nameRegexPattern == null) {
String regex = getNameRegex();
if (regex == null) {
final String pattern = getNamePattern();
if (pattern == null)
return null;
regex = convertPatternToRegex(pattern);
}
int flags = isCaseSensitive() ? 0 : ( Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE );
nameRegexPattern = Pattern.compile(regex, flags);
}
return nameRegexPattern;
}
private static String convertPatternToRegex(final String pattern) {
assertNotNull(pattern, "pattern");
// return pattern.replaceAll("\\.", "\\\\.").replaceAll("\\?", ".").replaceAll("\\*", ".*");
// We better iterate *once* than calling replaceAll - which needs to do some iteration - again and again.
final StringBuilder res = new StringBuilder();
for (int i = 0; i < pattern.length(); ++i) {
final char c = pattern.charAt(i);
switch (c) {
case '.':
res.append("\\.");
break;
case '?':
res.append('.');
break;
case '*':
res.append(".*");
break;
case '\\':
res.append("\\\\");
break;
default:
res.append(c);
}
}
return res.toString();
}
@Override
public String toString() {
return getClass().getSimpleName() + '@' + Integer.toHexString(System.identityHashCode(this))
+ "[namePattern=" + namePattern
+ ", nameRegex=" + nameRegex
+ ", caseSensitive=" + caseSensitive
+ ", enabled=" + enabled
+ ']';
}
}