/* (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.rest;
import java.nio.file.Paths;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FilenameUtils;
import org.geoserver.monitor.Monitor;
import org.geoserver.monitor.RequestData;
import org.geoserver.monitor.RequestData.Category;
import org.geoserver.rest.DispatcherCallback;
import org.geoserver.rest.DispatcherCallbackAdapter;
import org.geotools.util.logging.Logging;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class RESTMonitorCallback extends DispatcherCallbackAdapter {
static final Logger LOGGER = Logging.getLogger(RESTMonitorCallback.class);
Monitor monitor;
@Autowired
public RESTMonitorCallback(Monitor monitor) {
this.monitor = monitor;
}
public void init(HttpServletRequest request, HttpServletResponse response) {
RequestData data = monitor.current();
if (data == null) {
//will happen in cases where the filter is not active
return;
}
data.setCategory(Category.REST);
if (request.getPathInfo() != null) {
String resource = Paths.get(request.getPathInfo()).getFileName().toString();
resource = FilenameUtils.getBaseName(resource);
data.getResources().add(resource);
}
monitor.update();
}
public void dispatched(HttpServletRequest request, HttpServletResponse response, Object handler) {
RequestData data = monitor.current();
if (data == null) {
// will happen in cases where the filter is not active
return;
}
try {
// do not import these classes, dynamic lookup allows to break the dependency
// on restconfig at runtime
Object controllerBean = DispatcherCallback.getControllerBean(handler);
if (controllerBean instanceof org.geoserver.rest.catalog.AbstractCatalogController
|| controllerBean instanceof org.geoserver.rest.AbstractGeoServerController) {
data.setService("RESTConfig");
}
} catch(Exception e) {
// no problem, happens if restconfig is not in the classpath
LOGGER.log(Level.FINE, "Error finding out if the call is a restconfig one", e);
}
monitor.update();
}
}