224 lines
6.9 KiB
Java
224 lines
6.9 KiB
Java
|
/**
|
|||
|
* 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) {
|
|||
|
}
|
|||
|
}
|
|||
|
|