package com.mossle.core.servlet; public abstract class UrlPatternMatcher { public static final UrlPatternMatcher DEFAULT_MATCHER = new AllPassUrlPatternMatcher(); private String urlPattern; public static UrlPatternMatcher create(String urlPattern) { UrlPatternMatcher urlPatternMatcher; if (urlPattern.equals("/*")) { urlPatternMatcher = DEFAULT_MATCHER; } else if (urlPattern.startsWith("*")) { String suffix = urlPattern.substring(1); urlPatternMatcher = new SuffixUrlPatternMatcher(suffix); } else if (urlPattern.endsWith("*")) { String prefix = urlPattern.substring(0, urlPattern.length() - 1); urlPatternMatcher = new PrefixUrlPatternMatcher(prefix); } else { urlPatternMatcher = new EqualsUrlPatternMatcher(urlPattern); } urlPatternMatcher.setUrlPattern(urlPattern); return urlPatternMatcher; } public abstract boolean matches(String url); public boolean shouldRedirect(String url) { return false; } public String getUrlPattern() { return urlPattern; } public void setUrlPattern(String urlPattern) { this.urlPattern = urlPattern; } static class SuffixUrlPatternMatcher extends UrlPatternMatcher { private String suffix; public SuffixUrlPatternMatcher(String suffix) { this.suffix = suffix; } public boolean matches(String url) { return url.endsWith(suffix); } } static class PrefixUrlPatternMatcher extends UrlPatternMatcher { private String withoutSlash; private String prefix; public PrefixUrlPatternMatcher(String prefix) { this.prefix = prefix; if (prefix.endsWith("/")) { withoutSlash = prefix.substring(0, prefix.length() - 1); } else { withoutSlash = prefix; } } public boolean matches(String url) { return shouldRedirect(url) || url.startsWith(prefix); } public boolean shouldRedirect(String url) { return url.equals(withoutSlash); } } static class EqualsUrlPatternMatcher extends UrlPatternMatcher { private String urlPattern; public EqualsUrlPatternMatcher(String urlPattern) { this.urlPattern = urlPattern; } public boolean matches(String url) { return url.equals(urlPattern); } } static class AllPassUrlPatternMatcher extends UrlPatternMatcher { public boolean matches(String url) { return true; } } }