diff options
Diffstat (limited to 'lib/cosTransactions/src/CosTransactions_TransactionFactory_impl.erl')
-rw-r--r-- | lib/cosTransactions/src/CosTransactions_TransactionFactory_impl.erl | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/lib/cosTransactions/src/CosTransactions_TransactionFactory_impl.erl b/lib/cosTransactions/src/CosTransactions_TransactionFactory_impl.erl new file mode 100644 index 0000000000..36e37e2d5f --- /dev/null +++ b/lib/cosTransactions/src/CosTransactions_TransactionFactory_impl.erl @@ -0,0 +1,178 @@ +%%-------------------------------------------------------------------- +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. 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% +%% +%% +%%---------------------------------------------------------------------- +%% File : CosTransactions_TransactionFactory_impl.erl +%% Purpose : Is provided to allow the transaction originator to begin +%% a transaction. +%%---------------------------------------------------------------------- + +-module('CosTransactions_TransactionFactory_impl'). + +%%--------------- INCLUDES ----------------------------------- +-include_lib("orber/include/corba.hrl"). + +%% Local +-include_lib("ETraP_Common.hrl"). +-include_lib("CosTransactions.hrl"). +%%--------------- IMPORTS------------------------------------- +-import('ETraP_Common', [get_option/3]). + +%%--------------- EXPORTS------------------------------------- +-export([create/3, recreate/3, init/1, terminate/2]). +-export([handle_call/3, handle_cast/2, handle_info/2, code_change/3]). + +%%--------------- LOCAL DATA --------------------------------- +-record(factory, {hashMax, subtrOK, typeCheck, maxRetries, comFailWait}). + +%%--------------- LOCAL DEFINITIONS -------------------------- + +%%------------------------------------------------------------ +%% function : init +%% Arguments: +%% Returns : +%% Effect : Functions demanded by the module ic. Used to initiate +%% a gen_server. +%%------------------------------------------------------------ + +init(Options) when is_list(Options) -> + ?debug_print("Factory:init(~p)~n", [Options]), + process_flag(trap_exit,true), + DefaultValues = [{maxRetries, ?tr_max_retries}, + {comFailWait, ?tr_comm_failure_wait}|?tr_FAC_DEF], + Hash = get_option(hash_max, Options, DefaultValues), + SubtrOK = get_option(allow_subtr, Options, DefaultValues), + TypeCheck = get_option(typecheck, Options, DefaultValues), + TTY = get_option(tty, Options, DefaultValues), + LogFile = get_option(logfile, Options, DefaultValues), + MaxRetries = get_option(maxRetries, Options, DefaultValues), + ComFailWait = get_option(comFailWait, Options, DefaultValues), + error_logger:tty(TTY), + case LogFile of + false -> + ok; + _-> + error_logger:logfile({open, LogFile}) + end, + {ok, #factory{typeCheck = TypeCheck, hashMax = Hash, subtrOK = SubtrOK, + maxRetries = MaxRetries, comFailWait = ComFailWait}}; + +init(Options) -> + ?tr_error_msg("TransactionFactory~nBad argument: ~p~n", [Options]), + corba:raise(?tr_badparam). + + +%%------------------------------------------------------------ +%% function : terminate +%% Arguments: +%% Returns : +%% Effect : Function demanded by the module ic. Used to +%% terminate a gen_server. +%%------------------------------------------------------------ + +terminate(_Reason, _State) -> + ?debug_print("Factory:terminate(~p)~n", [_Reason]), + ok. + +%%------------------------------------------------------------ +%% function : handle_call, handle_cast, handle_info, code_change +%% Arguments: +%% Returns : +%% Effect : Functions demanded by the module ic. +%%------------------------------------------------------------ + +code_change(_OldVsn, State, _Extra) -> + {ok, State}. + +handle_call(_,_, State) -> + {noreply, State}. + + +handle_cast(_, State) -> + {noreply, State}. + + +handle_info({'EXIT',_From,shutdown}, State) -> + ?debug_print("Factory:handle_info(~p)~n", [shutdown]), + {stop, shutdown, State}; +handle_info(_Info, State) -> + ?debug_print("Factory:handle_info(~p)~n", [_Info]), + {noreply, State}. + +%%------------------------------------------------------------ +%% function : create +%% Arguments: TimeOut - rollback the transaction after TimeOut +%% seconds. If 0 no timeout. +%% Returns : a Control object +%% Effect : Creates a new top-level transaction. The Control +%% can be used to manage or control participation +%% in the new transaction. Used for direct context +%% management. +%%------------------------------------------------------------ + +create(_Self, State, TimeOut) when is_integer(TimeOut) -> + %% Generate objectnames. + ETraPName = 'ETraP_Common':create_name("root"), + TermName = 'ETraP_Common':create_name("term"), + EState = ?tr_create_context(ETraPName, TermName, + State#factory.typeCheck, + State#factory.hashMax, + State#factory.subtrOK, + State#factory.maxRetries, + State#factory.comFailWait), + + case TimeOut of + 0 -> + ETraP = ?tr_start_child(?SUP_ETRAP(EState)), + {reply, ETraP, State}; + _ -> + if + TimeOut > 0 -> + {MegaSecs, Secs, _Microsecs} = erlang:now(), + EState2 = ?tr_set_alarm(EState, MegaSecs*1000000+Secs+TimeOut), + EState3 = ?tr_set_timeout(EState2, TimeOut*1000), + ETraP = ?tr_start_child(?SUP_ETRAP(EState3)), + {reply, ETraP, State}; + true -> + ?tr_error_msg("TransactionFactory:create( Integer >= 0 )~nBad argument. Not an integer.~n", []), + corba:raise(?tr_badparam) + end + end; + +create(_Self, _State, _TimeOut) -> + ?tr_error_msg("TransactionFactory:create( Integer >= 0 )~nBad argument. Not an integer.~n", []), + corba:raise(?tr_badparam). + + +%%------------------------------------------------------------ +%% function : recreate +%% Arguments: PropagationContext +%% Returns : a Control object +%% Effect : +%%------------------------------------------------------------ + +recreate(_Self, _State, #'CosTransactions_PropagationContext'{current = _C}) -> + corba:raise(#'NO_IMPLEMENT'{completion_status=?COMPLETED_YES}). +%recreate(Self, State, #'CosTransactions_PropagationContext'{current = C}) -> +% {reply, C#'CosTransactions_TransIdentity'.coord, State}. + + +%%--------------- END OF MODULE ------------------------------ + |