summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryan Duxbury <bryanduxbury@apache.org>2010-08-05 22:05:35 +0000
committerBryan Duxbury <bryanduxbury@apache.org>2010-08-05 22:05:35 +0000
commitd74ca156b3aaff49abca1b52461235031ef522b9 (patch)
tree6fd372c2092df793f858be327646cbac8882b0f1
parent067a7beb7350818c97edf24086f48cef2a9be1fa (diff)
downloadthrift-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.java119
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);
+ }
+}