52n-wps-server-gcube/src/main/java/org/n52/wps/server/CommunicationSizeLogFilter....

224 lines
6.9 KiB
Java
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Copyright (C) 2007 - 2016 52°North Initiative for Geospatial Open Source
* Software GmbH
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published
* by the Free Software Foundation.
*
* If the program is linked with libraries which are licensed under one of
* the following licenses, the combination of the program with the linked
* library is not considered a "derivative work" of the program:
*
* • Apache License, version 2.0
* • Apache Software License, version 1.0
* • GNU Lesser General Public License, version 3
* • Mozilla Public License, versions 1.0, 1.1 and 2.0
* • Common Development and Distribution License (CDDL), version 1.0
*
* Therefore the distribution of the program linked with libraries licensed
* under the aforementioned licenses, is permitted by the copyright holders
* if the distribution is compliant with both the GNU General Public
* License version 2 and the aforementioned licenses.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*/
package org.n52.wps.server;
// import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.math.BigDecimal;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.n52.wps.io.LargeBufferStream;
class ResponseSizeInfoStream extends ServletOutputStream {
private OutputStream intStream;
private LargeBufferStream baStream;
private boolean closed = false;
private long streamSize = 0;
public ResponseSizeInfoStream(OutputStream outStream) {
this.intStream = outStream;
// baStream = new ByteArrayOutputStream();
}
public void write(int i) throws java.io.IOException {
this.streamSize++;
this.intStream.write(i);
}
public void close() throws java.io.IOException {
if (!this.closed) {
this.intStream.close();
this.closed = true;
}
}
/* public void flush() throws java.io.IOException {
if (baStream.size() != 0) {
if (! closed) {
// processStream(); // need to synchronize the flush!
// baStream = new ByteArrayOutputStream();
}
}
}
*/
public void processStream() throws java.io.IOException {
baStream.close();
baStream.writeTo(intStream);
this.intStream.flush();
}
public byte [] countBytes(byte [] inBytes) {
//streamSize = streamSize + inBytes.length;
return inBytes;
}
public long getSize() {
if(this.closed) {
return streamSize;
} else
return -1;
}
}
class ResponseSizeInfoWrapper extends HttpServletResponseWrapper {
private PrintWriter tpWriter;
private ResponseSizeInfoStream tpStream;
public ResponseSizeInfoWrapper(ServletResponse inResp) throws java.io.IOException {
super((HttpServletResponse) inResp);
tpStream = new ResponseSizeInfoStream(inResp.getOutputStream());
tpWriter = new PrintWriter(tpStream);
}
public ServletOutputStream getOutputStream() throws java.io.IOException {
return tpStream;
}
public PrintWriter getWriter() throws java.io.IOException {
return tpWriter;
}
}
class RequestSizeInfoStream extends ServletInputStream {
// private BufferedInputStream buStream;
private boolean closed = false;
private long streamSize = 0;
private InputStream inputStream;
public RequestSizeInfoStream(InputStream inStream) {
this.inputStream = inStream;
// buStream = new BufferedInputStream(inStream);
}
@Override
public int read() throws IOException {
this.streamSize++;
return this.inputStream.read();
}
public void close() throws java.io.IOException {
if (!this.closed) {
// processStream();
this.inputStream.close();
this.closed = true;
}
}
/* public void processStream() throws IOException {
byte[] bytes = new byte[8096];
int length = buStream.read(bytes, 0 , 8096);
while(length != -1) {
length = buStream.read(bytes, 0 , 8096);
streamSize = streamSize + length;
}
}*/
public long getSize() {
if(this.closed) {
return this.streamSize;
}
else
return -1;
}
}
class RequestSizeInfoWrapper extends HttpServletRequestWrapper {
private BufferedReader tpReader;
private RequestSizeInfoStream tpStream;
public RequestSizeInfoWrapper(ServletRequest req) throws java.io.IOException {
super((HttpServletRequest) req);
this.tpStream = new RequestSizeInfoStream(req.getInputStream());
this.tpReader = new BufferedReader(new InputStreamReader(this.tpStream));
}
public ServletInputStream getInputStream() throws java.io.IOException {
return this.tpStream;
}
public BufferedReader getReader() throws IOException {
return this.tpReader;
}
}
/** This class measures the payload of the post data
*
* @author foerster
*
*/
public final class CommunicationSizeLogFilter implements Filter {
private static Logger LOGGER = LoggerFactory.getLogger(CommunicationSizeLogFilter.class);
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
RequestSizeInfoWrapper myWrappedReq = new RequestSizeInfoWrapper(request);
ResponseSizeInfoWrapper myWrappedResp = new ResponseSizeInfoWrapper(response);
chain.doFilter(myWrappedReq, myWrappedResp);
myWrappedReq.getInputStream().close();
myWrappedResp.getOutputStream().close();
long requestSize = ((RequestSizeInfoStream)myWrappedReq.getInputStream()).getSize();
long responseSize = ((ResponseSizeInfoStream)myWrappedResp.getOutputStream()).getSize();
if(requestSize == 0) {
return;
}
BigDecimal result = new BigDecimal((double)responseSize/(double)requestSize).setScale(4, BigDecimal.ROUND_HALF_UP);
result = result.movePointRight(2);
LOGGER.info("Simplification ratio " + result);
}
public void destroy() {
}
public void init(FilterConfig filterConfig) {
}
}