/* (c) 2016 Open Source Geospatial Foundation - all rights reserved * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.params.extractor; import org.geoserver.config.GeoServerDataDirectory; import org.geoserver.filters.GeoServerFilter; import org.geoserver.platform.ExtensionPriority; import org.geoserver.platform.resource.Resource; import org.geoserver.platform.resource.ResourceStore; import org.geotools.util.logging.Logging; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.List; import java.util.logging.Logger; public final class Filter implements GeoServerFilter, ExtensionPriority { private static final Logger LOGGER = Logging.getLogger(Filter.class); private List<Rule> rules; public Filter(GeoServerDataDirectory dataDirectory) { Resource resource = dataDirectory.get(RulesDao.getRulesPath()); rules = RulesDao.getRules(resource.in()); resource.addListener(notify -> rules = RulesDao.getRules(resource.in())); } @Override public int getPriority() { return ExtensionPriority.HIGHEST; } @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) request; if (httpServletRequest.getRequestURI().contains("web/wicket") || httpServletRequest.getRequestURI().contains("geoserver/web")) { chain.doFilter(request, response); return; } UrlTransform urlTransform = new UrlTransform(httpServletRequest.getRequestURI(), httpServletRequest.getParameterMap()); String originalRequest = urlTransform.toString(); rules.forEach(rule -> rule.apply(urlTransform)); if (urlTransform.haveChanged()) { Utils.info(LOGGER, "Request '%s' transformed to '%s'.", originalRequest, urlTransform.toString()); chain.doFilter(new RequestWrapper(urlTransform, httpServletRequest), response); } else { chain.doFilter(request, response); } } @Override public void destroy() { } }