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}