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) {
|
||
}
|
||
}
|
||
|