/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* Copyright (c) 2014, MPL CodeInside http://codeinside.ru
*/
package ru.codeinside.gws.p.router.web.wrap;
import ru.codeinside.gws.api.ServerLog;
import ru.codeinside.gws.p.router.web.Registry;
import ru.codeinside.gws.p.router.web.ServerLogResource;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
final public class LoggerFilter implements Filter {
public void doFilter(ServletRequest servletRequest, ServletResponse resp,
FilterChain chain) throws ServletException, IOException {
final HttpServletRequest req = (HttpServletRequest) servletRequest;
// В СМЭВ только POST запросы
final boolean post = "POST".equalsIgnoreCase(req.getMethod());
final Registry registry = !post ? null : Registry.REGISTRY.get();
final ServerLogResource serverLogResource = registry == null ? null : registry.getServerLogResource();
if (serverLogResource != null) {
processExchange(req, (HttpServletResponse) resp, chain, serverLogResource);
} else {
chain.doFilter(req, resp);
}
}
private void processExchange(HttpServletRequest req, HttpServletResponse resp,
FilterChain chain,
ServerLogResource serverLogResource) throws IOException, ServletException {
try {
ServerLog serverLog = serverLogResource.createLog(req);
if (serverLog == null) {
chain.doFilter(req, resp);
} else {
logExchange(chain, req, resp, serverLog);
}
} finally {
serverLogResource.close();
}
}
private void logExchange(FilterChain chain, HttpServletRequest httpReq,
HttpServletResponse httpResp,
ServerLog serverLog) throws IOException, ServletException {
try {
chain.doFilter(
new HttpServletRequestLogger(serverLog, httpReq),
new HttpServletResponseLogger(serverLog, httpResp)
);
} finally {
serverLog.close();
}
}
public void init(FilterConfig config) throws ServletException {
}
public void destroy() {
}
}