orber_diagnostics.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 241 行

ERL
241
字号
%%--------------------------------------------------------------------%% ``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 via the world wide web 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.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %%     $Id$%%%%-----------------------------------------------------------------%% File: orber_diagnostics.erl%% %% Description:%%%% Creation date: 8 Apr 2003%%%%------------------------------------------------------------------module(orber_diagnostics).%%-----------------------------------------------------------------%% Includes%%------------------------------------------------------------------include_lib("orber/src/orber_iiop.hrl").-include_lib("orber/src/ifr_objects.hrl").-include_lib("orber/COSS/CosNaming/CosNaming.hrl").-include_lib("orber/COSS/CosNaming/CosNaming_NamingContext.hrl").-include_lib("orber/COSS/CosNaming/orber_cosnaming.hrl").%%-----------------------------------------------------------------%% External exports%%------------------------------------------------------------------export([nameservice/0, nameservice/1, 	 objectkeys/0, 	 missing_modules/0]).%%-----------------------------------------------------------------%% Internal Exports%%------------------------------------------------------------------export([]).%%-----------------------------------------------------------------%% Internal exports%%-----------------------------------------------------------------%%-----------------------------------------------------------------%% Macros%%------------------------------------------------------------------define(DEBUG_LEVEL, 5).-define(DIAGNOSTICS_PING_EXTERNAL, 16#01).%%-----------------------------------------------------------------%% Function  : missing_modules%% Args      : -%% Returns   : %%-----------------------------------------------------------------missing_modules() ->    List =	case orber:light_ifr() of	    false ->		Unions = mnesia:dirty_select(ir_UnionDef, 					     [{#ir_UnionDef{absolute_name='$1', 							    _='_'}, 					       [], ['$1']}]),		Structs = mnesia:dirty_select(ir_StructDef, 					      [{#ir_StructDef{absolute_name='$1', 							      _='_'}, 						[], ['$1']}]),		Exc = mnesia:dirty_select(ir_ExceptionDef, 					  [{#ir_ExceptionDef{absolute_name='$1', 							     _='_'}, 					    [], ['$1']}]),		Interface = mnesia:dirty_select(ir_InterfaceDef, 						[{#ir_InterfaceDef{absolute_name='$1', 								   _='_'}, 						  [], ['$1']}]),		Acc1 = create_module_names(Unions, [], ?IFR_UnionDef),		Acc2 = create_module_names(Structs, Acc1, ?IFR_StructDef),		Acc3 = create_module_names(Exc, Acc2, ?IFR_ExceptionDef),		create_module_names(Interface, Acc3, ?IFR_InterfaceDef);	    true ->		mnesia:dirty_select(orber_light_ifr, 				    [{#orber_light_ifr{module='$1', 						       type='$2', _='_'}, 				      [{'=/=', '$2', ?IFR_ModuleDef},				       {'=/=', '$2', ?IFR_ConstantDef},				       {'=/=', '$2', ?IFR_AliasDef},				       {'=/=', '$2', ?IFR_EnumDef}], ['$$']}])	end,    io:format("Need to check for ~p modules.~n", [length(List)]),    Count = missing_modules_helper(List, 0),    io:format("Check completed. ~p missing modules.~n", [Count]),    Count.   create_module_names([], Acc, _) ->    Acc;create_module_names([[$:,$:|N]|T], Acc, Type) ->    create_module_names(T, [[change_colons_to_underscore(N, []), Type]|Acc], Type).change_colons_to_underscore([$:, $: | T], Acc) ->    change_colons_to_underscore(T, [$_ |Acc]);change_colons_to_underscore([H |T], Acc) ->    change_colons_to_underscore(T, [H |Acc]);change_colons_to_underscore([], Acc) ->    list_to_atom(lists:reverse(Acc)).missing_modules_helper([], ErrorsFound) ->    ErrorsFound;missing_modules_helper([[Mod, Type]|T], ErrorsFound) when Type == ?IFR_StructDef;							  Type == ?IFR_UnionDef;							  Type == ?IFR_ExceptionDef ->    case catch Mod:tc() of	{'EXIT', _} ->	    io:format("Missing (~s): ~p~n", [type2str(Type), Mod]),	    missing_modules_helper(T, ErrorsFound + 1);	_ ->	    missing_modules_helper(T, ErrorsFound)    end;missing_modules_helper([[Mod, Type]|T], ErrorsFound) when Type == ?IFR_InterfaceDef ->    case catch Mod:oe_get_interface() of	{'EXIT', {undef,[{Mod, _, _}|_]}} ->	    io:format("Missing (Interface): ~p~n", [Mod]),	    missing_modules_helper(T, ErrorsFound + 1);	{'EXIT', {undef,[{OtherMod, _, _}|_]}} ->	    io:format("Missing (Inherited by the ~p Interface): ~p~n", 		      [Mod, OtherMod]),	    missing_modules_helper(T, ErrorsFound + 1);	_ ->	    missing_modules_helper(T, ErrorsFound)    end;missing_modules_helper([_|T], ErrorsFound) ->    missing_modules_helper(T, ErrorsFound).type2str(?IFR_StructDef) ->    "Struct";type2str(?IFR_UnionDef) ->    "Union";type2str(?IFR_ExceptionDef) ->     "Exception".   %%-----------------------------------------------------------------%% Function  : nameservice%% Args      : - | integer()%% Returns   : %%-----------------------------------------------------------------nameservice() ->    nameservice(0).nameservice(Flags) ->    case catch ns(?ORB_FLAG_TEST(Flags, ?DIAGNOSTICS_PING_EXTERNAL)) of	ok ->	    ok;	{'EXCEPTION', E} ->	    orber:dbg("[~p] orber_diagnostics:nameservice(~p);~n"		      "Reason: ~p", [?LINE, Flags, E], ?DEBUG_LEVEL),	    corba:raise(E);	What ->	    orber:dbg("[~p] orber_diagnostics:nameservice(~p);~n"		      "Reason: ~p", [?LINE, Flags, What], ?DEBUG_LEVEL),	    corba:raise(#'INTERNAL'{completion_status=?COMPLETED_NO})    end.ns(Ping) ->    NS = corba:resolve_initial_references("NameService"),    display_names(NS, "", Ping).display_names(NS, Prefix, Ping) ->    {ok, [], Iter} = 'CosNaming_NamingContextExt':list(NS, 0),    More = not corba_object:is_nil(Iter),    iter_names(NS, Prefix, Iter, More, Ping).iter_names(_NS, _Prefix, Iter, false, _) ->    destroy_iter(Iter);iter_names(NS, Prefix, Iter, true, Ping) ->    {More, #'CosNaming_Binding'{binding_name = Name, binding_type = Type}} =        'CosNaming_BindingIterator':next_one(Iter),    Fun = fun(#'CosNaming_NameComponent'{id = Id, kind = Kind}, Acc) ->              case Kind of                  "" -> Acc ++ Id ++ "/";                  _  -> Acc ++ Id ++ "." ++ Kind ++ "/"              end          end,    Prefix2 = lists:foldl(Fun, Prefix, Name),    if         More == false ->            ignore;         Type == nobject ->            Object = 'CosNaming_NamingContext':resolve(NS, Name),	    Status = 		case corba_object:is_remote(Object) of		    false ->			corba_object:non_existent(Object);		    _ when Ping == true ->			case catch corba_object:non_existent(Object) of			    Boolean when atom(Boolean) ->				Boolean;			    _Other ->				undefined			end;		    _ ->			external		end,            io:format("~s [~p] ~s\n", 		      [Prefix2, Status, iop_ior:get_typeID(Object)]);         Type == ncontext ->            Context = 'CosNaming_NamingContext':resolve(NS, Name),            io:format("~s\n", [Prefix2]),            display_names(Context, Prefix2, Ping)    end,    iter_names(NS, Prefix, Iter, More, Ping).destroy_iter(Iter) ->    case corba_object:is_nil(Iter) of        false -> 	    'CosNaming_BindingIterator':destroy(Iter),	    ok;        true  -> 	    ok    end.objectkeys() ->    ok.%%---------------- END OF MODULE ----------------------------------

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?