package com.camptocamp.owsproxy;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
/**
* Implementation class for Proxy OWS Servlet
*
*/
public class OWSProxyServlet extends javax.servlet.http.HttpServlet implements
javax.servlet.Servlet {
private String SERVICE_END_POINT;
@Override
public void init() throws ServletException {
super.init();
SERVICE_END_POINT = getInitParameter("serviceEndPoint");
if (SERVICE_END_POINT == null)
throw new ServletException("You need to define the serviceEndPoint Parameter in the web.xml file");
}
/*
* (non-Java-doc)
*
* @see javax.servlet.http.HttpServlet#HttpServlet()
*/
public OWSProxyServlet() {
super();
}
/*
* (non-Java-doc)
*
* @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request,
* HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String queryString = request.getQueryString();
// Some WMS Client, like ArcMAP, only send the QUERY_LAYERS parameter without a LAYERS parameter.
// However, some WMS server like MapServer fail in case there is no LAYERS parameter send.
// Thus, we add a LAYERS parameter in case only a QUERY_LAYERS parameter is available.
// -> Keep this in sync with the code in org.deegree.ogcwebservices.wms.operation.GetFeatureInfo::create()
if (request.getParameter("QUERY_LAYERS") != null && request.getParameter("LAYERS") == null) {
queryString += "&LAYERS=" + request.getParameter("QUERY_LAYERS");
}
String endPoint = "" + SERVICE_END_POINT;
try {
HttpClient client = new HttpClient();
if (queryString != null) {
if (endPoint.indexOf("?") < 0)
endPoint += "?";
endPoint += queryString;
}
System.out.println("End point: " + endPoint);
HttpMethod method = new GetMethod(endPoint);
// Execute the method.
int statusCode = client.executeMethod(method);
if (statusCode != HttpStatus.SC_OK) {
System.err.println("Method failed: " + method.getStatusLine());
}
String header = "Content-Type";
Header contentTypeHeader = method.getResponseHeader(header);
if (contentTypeHeader != null) {
response.setContentType(contentTypeHeader.getValue());
}
byte[] cache = new byte[response.getBufferSize()];
InputStream in = method.getResponseBodyAsStream();
ServletOutputStream out = response.getOutputStream();
for (int read = in.read(cache); read > 0; read = in.read(cache)) {
out.write(cache, 0, read);
}
} catch (Exception e) {
throw new ServletException(e);
}
}
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
}
}