%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
%% compliance with the License. You should have received a copy of the
%% Erlang Public License along with this software. If not, it can be
%% retrieved online at http://www.erlang.org/.
%%
%% Software distributed under the License is distributed on an "AS IS"
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
%% the License for the specific language governing rights and limitations
%% under the License.
%%
%% %CopyrightEnd%
%%
%%
-module(etrap_test_server_impl).
%%--------------- INCLUDES -----------------------------------
-include_lib("orber/include/corba.hrl").
-include_lib("orber/include/ifr_types.hrl").
%% Local
-include_lib("cosTransactions/src/ETraP_Common.hrl").
-include_lib("cosTransactions/include/CosTransactions.hrl").
%%--------------- IMPORTS-------------------------------------
%%--------------- EXPORTS-------------------------------------
-export([prepare/2,
rollback/2,
commit/2,
commit_one_phase/2,
forget/2,
% before_completion/2,
% after_completion/3,
commit_subtransaction/3,
rollback_subtransaction/2]).
%%--------------- gen_server specific ------------------------
-export([init/1, terminate/2]).
-export([handle_call/3, handle_cast/2, handle_info/2, code_change/3]).
%%------------------------------------------------------------
%% function : init, terminate
%%------------------------------------------------------------
init(State) ->
process_flag(trap_exit,true),
io:format("etrap_test_server:init ~p~n", [State]),
?debug_print("STARTING etrap_test_server( ~p )~n", [State]),
{ok, State}.
terminate(Reason, _State) ->
io:format("etrap_test_server:terminate ~p~n", [Reason]),
?debug_print("STOPREASON etrap_test_server( ~p )~n", [Reason]),
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
handle_call(_,_, State) ->
{noreply, State}.
handle_cast(_, State) ->
{noreply, State}.
handle_info(_Info, State) ->
{noreply, State}.
%%-- Inherit from CosTransactions::SubtransactionAwareResource --
prepare(_Self, State) ->
case ?is_debug_compiled of
true ->
io:format("etrap_test_server:prepare ~p~n", [State]);
_->
ok
end,
% ?debug_print("etrap_test_server:prepare ~p~n", [State]),
action(prepare, State, {reply, 'VoteCommit', State}).
rollback(_Self, State) ->
case ?is_debug_compiled of
true ->
io:format("etrap_test_server:rollback ~p~n", [State]);
_->
ok
end,
% ?debug_print("etrap_test_server:rollback ~p~n", [State]),
case sync_test(State) of
true ->
action(rollback, State, {reply, ok, State});
_->
action(rollback, State, {stop, normal, ok, State})
end.
commit(_Self, State) ->
case ?is_debug_compiled of
true ->
io:format("etrap_test_server:commit ~p~n", [State]);
_->
ok
end,
% ?debug_print("etrap_test_server:commit ~p~n", [State]),
case sync_test(State) of
true ->
action(commit, State, {reply, ok, State});
_->
action(commit, State, {stop, normal, ok, State})
end.
commit_one_phase(_Self, State) ->
case ?is_debug_compiled of
true ->
io:format("etrap_test_server:commit_one_phase ~p~n", [State]);
_->
ok
end,
% ?debug_print("etrap_test_server:commit_one_phase ~p~n", [State]),
case sync_test(State) of
true ->
{reply, ok, State};
_->
{stop, normal, ok, State}
end.
forget(_Self, State) ->
case ?is_debug_compiled of
true ->
io:format("etrap_test_server:forget ~p~n", [State]);
_->
ok
end,
% ?debug_print("etrap_test_server:forget ~p~n", [State]),
case sync_test(State) of
true ->
{reply, ok, State};
_->
{stop, normal, ok, State}
end.
commit_subtransaction(_Self, State, Parent) ->
case ?is_debug_compiled of
true ->
io:format("etrap_test_server:commit_subtransaction( ~p )~n", [Parent]);
_->
ok
end,
% ?debug_print("etrap_test_server:commit_subtransaction( ~p )~n", [Parent]),
{reply, ok, State}.
rollback_subtransaction(_Self, State) ->
case ?is_debug_compiled of
true ->
io:format("etrap_test_server:rollback_subtransaction()~n", []);
_->
ok
end,
% ?debug_print("etrap_test_server:rollback_subtransaction()~n", []),
{reply, ok, State}.
%before_completion(_Self, State) ->
% case ?is_debug_compiled of
% true ->
% io:format("etrap_test_server:before_completion()~n", []);
% _->
% ok
% end,
%% ?debug_print("etrap_test_server:before_completion()~n", []),
% {reply, ok, State}.
%after_completion(_Self, State, Status) ->
% case ?is_debug_compiled of
% true ->
% io:format("etrap_test_server:after_completion( ~p )~n", [Status]);
% _->
% ok
% end,
%% ?debug_print("etrap_test_server:after_completion( ~p )~n", [Status]),
% {stop, normal, ok, State}.
%%--------------- LOCAL FUNCTIONS ----------------------------
action(Key, State, Default) ->
case catch lists:keysearch(Key, 1, State) of
{value,{Key, stop_reply, R}} ->
case sync_test(State) of
true ->
{reply, R, State};
_->
{stop, normal, R, State}
end;
{value,{Key, reply, R}} ->
{reply, R, State};
{value,{Key, exc, E}} ->
corba:raise(E);
{value,{Key, delay, Time}} ->
timer:sleep(Time*1000),
Default;
{value,{Key,Value}} ->
Value;
_ ->
Default
end.
sync_test(State) ->
case catch lists:keysearch(sync, 1, State) of
{value,{sync, true}} ->
true;
_ ->
false
end.
%%--------------- END OF MODULE ------------------------------