%%----------------------------------------------------------------------
%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2004-2012. 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: orber_tb.erl
%%
%% Description:
%% Handling MISC functions.
%%
%% Creation date: 040723
%%
%%----------------------------------------------------------------------
-module(orber_tb).
-include_lib("orber/include/corba.hrl").
-include_lib("orber/src/orber_iiop.hrl").
%%----------------------------------------------------------------------
%% External exports
%%----------------------------------------------------------------------
%% Avoid warning for local function error/2 clashing with autoimported BIF.
-compile({no_auto_import,[error/2]}).
-export([wait_for_tables/1, wait_for_tables/2, wait_for_tables/3,
is_loaded/0, is_loaded/1, is_running/0, is_running/1,
info/2, error/2, unique/1, keysearch/2, keysearch/3,
check_illegal_tcp_options/1]).
%%----------------------------------------------------------------------
%% Internal exports
%%----------------------------------------------------------------------
-define(DEBUG_LEVEL, 5).
-define(FORMAT(_F, _A), {error, lists:flatten(io_lib:format(_F, _A))}).
-define(EFORMAT(_F, _A), exit(lists:flatten(io_lib:format(_F, _A)))).
%%----------------------------------------------------------------------
%% Record Definitions
%%----------------------------------------------------------------------
%%----------------------------------------------------------------------
%% External functions
%%----------------------------------------------------------------------
%%----------------------------------------------------------------------
%% Function : is_loaded/is_running
%% Arguments :
%% Returns :
%% Raises :
%% Description:
%%----------------------------------------------------------------------
is_loaded() ->
is_loaded(orber).
is_loaded(Appl) ->
find_application(application:loaded_applications(), Appl).
is_running() ->
is_running(orber).
is_running(Appl) ->
find_application(application:which_applications(), Appl).
find_application([], _) ->
false;
find_application([{Appl, _, _} |_], Appl) ->
true;
find_application([_ |As], Appl) ->
find_application(As, Appl).
%%----------------------------------------------------------------------
%% function : keysearch/2/3
%% Arguments: KeyValue - [{Key, Value}]
%% Key - term()
%% Value - term()
%% Default - term()
%% Returns : Value | Default
%% Exception:
%% Effect :
%%----------------------------------------------------------------------
keysearch(Key, KeyValue) ->
keysearch(Key, KeyValue, undefined).
keysearch(Key, KeyValue, Default) ->
case lists:keysearch(Key, 1, KeyValue) of
{value, {Key, Value}} ->
Value;
_ ->
Default
end.
%%----------------------------------------------------------------------
%% function : wait_for_tables/1
%% Arguments: Tables - list of mnesia tables
%% Timeout - integer (no point in allowing infinity)
%% Attempts - integer > 0 How many times should we try
%% Returns :
%% Exception:
%% Effect :
%%----------------------------------------------------------------------
wait_for_tables(Tables) ->
wait_for_tables(Tables, 30000, -1).
wait_for_tables(Tables, Timeout) ->
wait_for_tables(Tables, Timeout, -1).
wait_for_tables(Tables, _Timeout, 0) ->
error("Mnesia failed to load the some or all of the following"
"tables:~n~p", [Tables]),
{error, "The requested Mnesia tables not yet available."};
wait_for_tables(Tables, Timeout, Attempts) ->
case mnesia:wait_for_tables(Tables, Timeout) of
ok ->
ok;
{timeout, BadTabList} ->
info("Mnesia hasn't loaded the following tables (~p msec):~n~p",
[Timeout, BadTabList]),
wait_for_tables(BadTabList, Timeout, Attempts-1);
{error, Reason} ->
error("Mnesia failed to load the some or all of the following"
"tables:~n~p", [Tables]),
{error, Reason}
end.
%%----------------------------------------------------------------------
%% function : unique/1
%% Arguments: List - [term()]
%% Returns : [term()]
%% Exception:
%% Effect : Remove all duplicates from the list.
%%----------------------------------------------------------------------
unique([]) -> [];
unique(List) ->
Sorted = lists:sort(List),
unique(hd(Sorted),
tl(Sorted), []).
unique(A, [A|R], Acc) ->
unique(A, R, Acc);
unique(A, [B|R], Acc) ->
unique(B, R, [A|Acc]);
unique(A, [], Acc) ->
lists:reverse([A|Acc]).
%%----------------------------------------------------------------------
%% function : info/2
%% Arguments:
%% Returns :
%% Exception:
%% Effect :
%%----------------------------------------------------------------------
info(Format, Args) ->
catch error_logger:info_msg("=================== Orber =================~n"++
Format++
"~n===========================================~n",
Args).
%%----------------------------------------------------------------------
%% function : error/2
%% Arguments:
%% Returns :
%% Exception:
%% Effect :
%%----------------------------------------------------------------------
error(Format, Args) ->
catch error_logger:error_msg("=================== Orber =================~n"++
Format++
"~n===========================================~n",
Args).
%%----------------------------------------------------------------------
%% function : check_illegal_tcp_options/1
%% Arguments:
%% Returns :
%% Exception:
%% Effect :
%%----------------------------------------------------------------------
check_illegal_tcp_options(Options) ->
check_illegal_tcp_options(Options, []).
check_illegal_tcp_options([],[]) ->
ok;
check_illegal_tcp_options([],IllegalOpts) ->
{error, IllegalOpts};
check_illegal_tcp_options([{active, V} |T], IllegalOpts) ->
check_illegal_tcp_options(T,[{active, V} |IllegalOpts]);
check_illegal_tcp_options([{packet, V} |T], IllegalOpts) ->
check_illegal_tcp_options(T,[{packet, V} |IllegalOpts]);
check_illegal_tcp_options([{mode, V} |T], IllegalOpts) ->
check_illegal_tcp_options(T,[{mode, V} |IllegalOpts]);
check_illegal_tcp_options([list |T], IllegalOpts) ->
check_illegal_tcp_options(T,[list |IllegalOpts]);
check_illegal_tcp_options([binary |T], IllegalOpts) ->
check_illegal_tcp_options(T,[binary |IllegalOpts]);
check_illegal_tcp_options([{reuseaddr, V} |T], IllegalOpts) ->
check_illegal_tcp_options(T,[{reuseaddr, V} |IllegalOpts]);
check_illegal_tcp_options([_H|T], IllegalOpts) ->
check_illegal_tcp_options(T, IllegalOpts).
%%----------------------------------------------------------------------
%% Internal functions
%%----------------------------------------------------------------------
%%----------------------------------------------------------------------
%%------------- END OF MODULE ------------------------------------------
%%----------------------------------------------------------------------