/* Copyright (c) 2001 - 2011 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, availible at the root
* application directory.
*/
package org.geoserver.monitor;
import java.io.BufferedReader;
import java.io.File;
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.ows.util.ResponseUtils;
import org.geoserver.platform.FileWatcher;
import org.geoserver.platform.GeoServerResourceLoader;
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();
}
public MonitorRequestFilter(GeoServerResourceLoader loader) throws IOException {
//loader.findOrCreateDirectory("monitoring");
File configFile = loader.find("monitoring", "filter.properties");
if (configFile == null) {
configFile = loader.createFile("monitoring", "filter.properties");
loader.copyFromClassPath("filter.properties", configFile, getClass());
}
watcher = new FileWatcher<List<Filter>>(configFile) {
@Override
protected List<Filter> parseFileContents(InputStream in) throws IOException {
List<Filter> filters = new ArrayList();
BufferedReader r = new BufferedReader(new InputStreamReader(in));
String line = null;
while ((line = r.readLine()) != null) {
filters.add(new Filter(line));
}
return filters;
}
};
}
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");
}
for (Filter f : filters) {
if (f.matches(path)) {
return true;
}
}
return false;
}
static class Filter {
AntPathMatcher matcher = new AntPathMatcher();
String pattern;
Filter(String pattern) {
this.pattern = pattern;
}
boolean matches(String path) {
return matcher.match(pattern, path);
}
}
}