Make processor use a service definition and handler to determine types
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@666376 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/alterl/src/test_handler.erl b/lib/alterl/src/test_handler.erl
new file mode 100644
index 0000000..a0aa2a5
--- /dev/null
+++ b/lib/alterl/src/test_handler.erl
@@ -0,0 +1,7 @@
+-module(test_handler).
+
+-export([handle_function/2]).
+
+handle_function(add, Params = {A, B}) ->
+ io:format("Got params: ~p~n", [Params]),
+ {reply, A + B}.
diff --git a/lib/alterl/src/test_service.erl b/lib/alterl/src/test_service.erl
new file mode 100644
index 0000000..b7f00d9
--- /dev/null
+++ b/lib/alterl/src/test_service.erl
@@ -0,0 +1,10 @@
+-module(test_service).
+%
+% Test service definition
+
+-export([function_info/2]).
+
+function_info(add, params_type) ->
+ {struct, [{1, i32},
+ {2, i32}]};
+function_info(add, reply_type) -> i32.
diff --git a/lib/alterl/src/thrift_processor.erl b/lib/alterl/src/thrift_processor.erl
index fd6972d..546bcfe 100644
--- a/lib/alterl/src/thrift_processor.erl
+++ b/lib/alterl/src/thrift_processor.erl
@@ -36,35 +36,57 @@
ok
end.
-handle_function(State = #state{in_protocol = IProto,
- out_protocol = OProto},
- add) ->
- io:format("Reading struct~n"),
- {ok, Struct} = thrift_protocol:read(IProto,
- {struct, [{1, i32},
- {2, i32}]}),
- io:format("Struct: ~p~n", [Struct]),
+%handle_function(State = #state{in_protocol = IProto,
+% out_protocol = OProto},
+% add) ->
+% io:format("Reading struct~n"),
+% {ok, Struct} = thrift_protocol:read(IProto,
+% {struct, [{1, i32},
+% {2, i32}]}),
+% io:format("Struct: ~p~n", [Struct]),
- {A, B} = Struct,
+% {A, B} = Struct,
- thrift_protocol:write(OProto, #protocol_message_begin{
- name = "addResult",
+% thrift_protocol:write(OProto, #protocol_message_begin{
+% name = "addResult",
+% type = ?tMessageType_REPLY,
+% seqid = 0}),
+% thrift_protocol:write(OProto, {{struct, [{0, i32}]},
+% {A + B}}),
+% thrift_protocol:write(OProto, message_end);
+
+%handle_function(State = #state{in_protocol = IProto,
+% out_protocol = OProto},
+% complexTest) ->
+% io:format("Reading struct~n"),
+% Struct = thrift_protocol:read(
+% IProto,
+% {struct, [{1, {struct,
+% [{1, {list, i32}},
+% {2, {map, string, {struct, [{1, i16}]}}}]}}]}),
+
+% io:format("Struct: ~p~n", [Struct]);
+
+
+handle_function(State = #state{in_protocol = IProto,
+ out_protocol = OProto,
+ handler = Handler,
+ service = Service},
+ Function) ->
+ InParams = Service:function_info(Function, params_type),
+
+ {ok, Params} = thrift_protocol:read(IProto, InParams),
+ Result = Handler:handle_function(Function, Params),
+
+ ReplyType = Service:function_info(Function, reply_type),
+
+ case Result of
+ {reply, Reply} ->
+ thrift_protocol:write(OProto, #protocol_message_begin{
+ name = atom_to_list(Function) ++ "_result",
type = ?tMessageType_REPLY,
seqid = 0}),
- thrift_protocol:write(OProto, {{struct, [{0, i32}]},
- {A + B}}),
- thrift_protocol:write(OProto, message_end);
-
-handle_function(State = #state{in_protocol = IProto,
- out_protocol = OProto},
- complexTest) ->
- io:format("Reading struct~n"),
- Struct = thrift_protocol:read(
- IProto,
- {struct, [{1, {struct,
- [{1, {list, i32}},
- {2, {map, string, {struct, [{1, i16}]}}}]}}]}),
-
- io:format("Struct: ~p~n", [Struct]).
-
-
+ thrift_protocol:write(OProto, {{struct, [{0, ReplyType}]}, {Reply}}),
+ thrift_protocol:write(OProto, message_end)
+ end,
+ ok.
diff --git a/lib/alterl/src/thrift_server.erl b/lib/alterl/src/thrift_server.erl
index fd559f1..5760e1c 100644
--- a/lib/alterl/src/thrift_server.erl
+++ b/lib/alterl/src/thrift_server.erl
@@ -19,7 +19,6 @@
-define(SERVER, ?MODULE).
-record(state, {listen_socket, acceptor, service}).
--record(handler, {module}).
%%====================================================================
%% API
@@ -42,8 +41,7 @@
%% {stop, Reason}
%% Description: Initiates the server
%%--------------------------------------------------------------------
-init({Port, Service, HandlerModule}) ->
- Handler = #handler{module = HandlerModule},
+init({Port, Service, Handler}) ->
{ok, Socket} = gen_tcp:listen(Port,
[binary,
{packet, 0},
@@ -109,7 +107,7 @@
%%--------------------------------------------------------------------
acceptor(ListenSocket, Service, Handler)
- when is_port(ListenSocket), is_record(Handler, handler) ->
+ when is_port(ListenSocket), is_atom(Handler) ->
{ok, Socket} = gen_tcp:accept(ListenSocket),
error_logger:info_msg("Accepted client"),
diff --git a/lib/alterl/src/thrift_service.erl b/lib/alterl/src/thrift_service.erl
index 89479c8..1ecfb9d 100644
--- a/lib/alterl/src/thrift_service.erl
+++ b/lib/alterl/src/thrift_service.erl
@@ -3,4 +3,4 @@
-export([behaviour_info/1]).
behaviour_info(callbacks) ->
- [{service_info, 1}].
+ [{function_info, 2}].