/* (c) 2017 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.rest;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.geoserver.platform.GeoServerExtensions;
import org.geotools.util.logging.Logging;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
/**
* Interceptor notifying {@link DispatcherCallback} of request processing progress
*/
public class CallbackInterceptor extends HandlerInterceptorAdapter {
static final Logger LOGGER = Logging.getLogger(CallbackInterceptor.class);
List<DispatcherCallback> getCallbacks() {
return GeoServerExtensions.extensions(DispatcherCallback.class);
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
List<DispatcherCallback> callbacks = getCallbacks();
// for semi-backwards compatibility
for (DispatcherCallback callback : callbacks) {
callback.init(request, response);
}
// the real thing
for (DispatcherCallback callback : callbacks) {
callback.dispatched(request, response, handler);
}
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
List<DispatcherCallback> callbacks = getCallbacks();
if (ex != null) {
for (DispatcherCallback callback : callbacks) {
callback.exception(request, response, ex);
}
}
// ensure that finish is always called for all requests
for (DispatcherCallback callback : callbacks) {
try {
callback.finished(request, response);
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "Callback threw exception on finish", e);
}
}
}
}