diff options
author | Bryan Duxbury <bryanduxbury@apache.org> | 2010-08-05 22:05:35 +0000 |
---|---|---|
committer | Bryan Duxbury <bryanduxbury@apache.org> | 2010-08-05 22:05:35 +0000 |
commit | d74ca156b3aaff49abca1b52461235031ef522b9 (patch) | |
tree | 6fd372c2092df793f858be327646cbac8882b0f1 | |
parent | 067a7beb7350818c97edf24086f48cef2a9be1fa (diff) | |
download | thrift-d74ca156b3aaff49abca1b52461235031ef522b9.tar.gz |
THRIFT-814. java: Include a TServlet in the standard Thrift distribution
This patch adds a TServlet implementation of the HttpServlet interface to be used with various containers.
Patch: Mathias Herberts
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@982802 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | lib/java/src/org/apache/thrift/server/TServlet.java | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/lib/java/src/org/apache/thrift/server/TServlet.java b/lib/java/src/org/apache/thrift/server/TServlet.java new file mode 100644 index 000000000..c1ab9df55 --- /dev/null +++ b/lib/java/src/org/apache/thrift/server/TServlet.java @@ -0,0 +1,119 @@ +package org.apache.thrift.server; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Map; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.thrift.TException; +import org.apache.thrift.TProcessor; +import org.apache.thrift.protocol.TProtocol; +import org.apache.thrift.protocol.TProtocolFactory; +import org.apache.thrift.transport.TIOStreamTransport; +import org.apache.thrift.transport.TTransport; + +/** + * Servlet implementation class ThriftServer + */ +public class TServlet extends HttpServlet { + + private final TProcessor processor; + + private final TProtocolFactory inProtocolFactory; + + private final TProtocolFactory outProtocolFactory; + + private final Collection<Map.Entry<String, String>> customHeaders; + + /** + * @see HttpServlet#HttpServlet() + */ + public TServlet(TProcessor processor, TProtocolFactory inProtocolFactory, + TProtocolFactory outProtocolFactory) { + super(); + this.processor = processor; + this.inProtocolFactory = inProtocolFactory; + this.outProtocolFactory = outProtocolFactory; + this.customHeaders = new ArrayList<Map.Entry<String, String>>(); + } + + /** + * @see HttpServlet#HttpServlet() + */ + public TServlet(TProcessor processor, TProtocolFactory protocolFactory) { + this(processor, protocolFactory, protocolFactory); + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + TTransport inTransport = null; + TTransport outTransport = null; + + try { + response.setContentType("application/x-thrift"); + + if (null != this.customHeaders) { + for (Map.Entry<String, String> header : this.customHeaders) { + response.addHeader(header.getKey(), header.getValue()); + } + } + InputStream in = request.getInputStream(); + OutputStream out = response.getOutputStream(); + + TTransport transport = new TIOStreamTransport(in, out); + inTransport = transport; + outTransport = transport; + + TProtocol inProtocol = inProtocolFactory.getProtocol(inTransport); + TProtocol outProtocol = outProtocolFactory.getProtocol(outTransport); + + processor.process(inProtocol, outProtocol); + out.flush(); + } catch (TException te) { + throw new ServletException(te); + } + } + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + doPost(request, response); + } + + public void addCustomHeader(final String key, final String value) { + this.customHeaders.add(new Map.Entry<String, String>() { + public String getKey() { + return key; + } + + public String getValue() { + return value; + } + + public String setValue(String value) { + return null; + } + }); + } + + public void setCustomHeaders(Collection<Map.Entry<String, String>> headers) { + this.customHeaders.clear(); + this.customHeaders.addAll(headers); + } +} |