/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.monitor;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import javax.servlet.http.HttpServletRequest;
import org.geoserver.data.util.IOUtils;
import org.geoserver.platform.FileWatcher;
import org.geoserver.platform.GeoServerResourceLoader;
import org.geoserver.platform.resource.Paths;
import org.geoserver.platform.resource.Resource;
import org.geoserver.platform.resource.Resource.Type;
import org.springframework.util.AntPathMatcher;
import static org.geoserver.monitor.MonitorFilter.LOGGER;
public class MonitorRequestFilter {
FileWatcher<List<Filter>> watcher;
List<Filter> filters;
public MonitorRequestFilter() {
filters = new ArrayList<Filter>();
}
public MonitorRequestFilter(GeoServerResourceLoader loader) throws IOException {
Resource configFile = loader.get( Paths.path("monitoring", "filter.properties") );
if (configFile.getType() == Type.UNDEFINED) {
IOUtils.copy(getClass().getResourceAsStream("filter.properties"), configFile.out());
}
filters = new ArrayList<Filter>();
watcher = new FilterPropertyFileWatcher(configFile);
}
public boolean filter(HttpServletRequest req) throws IOException {
if (watcher != null && watcher.isModified()) {
synchronized (this) {
if (watcher.isModified()) {
filters = watcher.read();
}
}
}
String path = req.getServletPath() + req.getPathInfo();
if (LOGGER.isLoggable(Level.FINER)) {
LOGGER.finer("Testing " + path + " for monitor filtering");
}
if(filters != null) {
for (Filter f : filters) {
if (f.matches(path)) {
return true;
}
}
}
return false;
}
/**
* FileWatcher used to parse List<Filter> from text file.
*/
private final class FilterPropertyFileWatcher extends FileWatcher<List<Filter>> {
private FilterPropertyFileWatcher(Resource resource) {
super(resource);
}
@Override
protected List<Filter> parseFileContents(InputStream in) throws IOException {
List<Filter> filters = new ArrayList<Filter>();
BufferedReader r = new BufferedReader(new InputStreamReader(in));
String line = null;
while ((line = r.readLine()) != null) {
filters.add(new Filter(line));
}
return filters;
}
}
/**
* Match path contents based on AntPathMatcher pattern
*/
static class Filter {
AntPathMatcher matcher = new AntPathMatcher();
String pattern;
/**
* Filter based on request path.
*
* @param pattern AntPathMatcher pattern
*/
Filter(String pattern) {
this.pattern = pattern;
}
/**
* Request path match.
*
* @param path Request path
* @return Request path match
*/
boolean matches(String path) {
return matcher.match(pattern, path);
}
}
}