001package co.codewizards.cloudstore.core.ignore; 002 003import static java.util.Objects.*; 004 005import java.util.regex.Pattern; 006 007public class IgnoreRuleImpl implements IgnoreRule { 008 private String ignoreRuleId; 009 private String namePattern; 010 private String nameRegex; 011 private boolean enabled; 012 private boolean caseSensitive; 013 private Pattern nameRegexPattern; 014 015 public IgnoreRuleImpl() { 016 } 017 018 @Override 019 public String getIgnoreRuleId() { 020 return ignoreRuleId; 021 } 022 @Override 023 public void setIgnoreRuleId(String ignoreRuleId) { 024 this.ignoreRuleId = ignoreRuleId; 025 } 026 027 @Override 028 public String getNamePattern() { 029 return namePattern; 030 } 031 032 @Override 033 public void setNamePattern(String namePattern) { 034 this.namePattern = namePattern; 035 this.nameRegexPattern = null; 036 } 037 038 @Override 039 public String getNameRegex() { 040 return nameRegex; 041 } 042 043 @Override 044 public void setNameRegex(String nameRegex) { 045 this.nameRegex = nameRegex; 046 this.nameRegexPattern = null; 047 } 048 049 @Override 050 public boolean isEnabled() { 051 return enabled; 052 } 053 054 @Override 055 public void setEnabled(boolean enabled) { 056 this.enabled = enabled; 057 } 058 059 @Override 060 public boolean isCaseSensitive() { 061 return caseSensitive; 062 } 063 064 @Override 065 public void setCaseSensitive(boolean caseSensitive) { 066 this.caseSensitive = caseSensitive; 067 this.nameRegexPattern = null; 068 } 069 070 @Override 071 public Pattern getNameRegexPattern() { 072 if (nameRegexPattern == null) { 073 String regex = getNameRegex(); 074 if (regex == null) { 075 final String pattern = getNamePattern(); 076 if (pattern == null) 077 return null; 078 079 regex = convertPatternToRegex(pattern); 080 } 081 int flags = isCaseSensitive() ? 0 : ( Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE ); 082 nameRegexPattern = Pattern.compile(regex, flags); 083 } 084 return nameRegexPattern; 085 } 086 087 private static String convertPatternToRegex(final String pattern) { 088 requireNonNull(pattern, "pattern"); 089// return pattern.replaceAll("\\.", "\\\\.").replaceAll("\\?", ".").replaceAll("\\*", ".*"); 090 // We better iterate *once* than calling replaceAll - which needs to do some iteration - again and again. 091 final StringBuilder res = new StringBuilder(); 092 for (int i = 0; i < pattern.length(); ++i) { 093 final char c = pattern.charAt(i); 094 switch (c) { 095 case '.': 096 res.append("\\."); 097 break; 098 case '+': 099 res.append("\\+"); 100 break; 101 case '?': 102 res.append('.'); 103 break; 104 case '*': 105 res.append(".*"); 106 break; 107 case '\\': 108 res.append("\\\\"); 109 break; 110 default: 111 res.append(c); 112 } 113 } 114 return res.toString(); 115 } 116 117 @Override 118 public String toString() { 119 return getClass().getSimpleName() + '@' + Integer.toHexString(System.identityHashCode(this)) 120 + "[namePattern=" + namePattern 121 + ", nameRegex=" + nameRegex 122 + ", caseSensitive=" + caseSensitive 123 + ", enabled=" + enabled 124 + ']'; 125 } 126}