orber_ifr_contained.erl

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

ERL
247
字号
%%--------------------------------------------------------------------%% ``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_ifr_contained.erl%% Purpose : Code for Contained%% Created : 14 May 1997%%-----------------------------------------------------------------------module(orber_ifr_contained).-export(['_get_def_kind'/1,	 destroy/1,	 cleanup_for_destroy/1,			%not in CORBA 2.0	 '_get_id'/1,	 '_set_id'/2,	 '_get_name'/1,	 '_set_name'/2,	 '_get_version'/1,	 '_set_version'/2,	 '_get_defined_in'/1,	 '_get_absolute_name'/1,	 '_get_containing_repository'/1,	 describe/1,	 describe/2,				%not in CORBA 2.0	 move/4	]).-import(orber_ifr_utils,[get_object/1,		   get_field/2,		   set_field/3,		   construct/3,		   select/2,		   write_result/1,		   ifr_transaction_read_write/1		  ]).-include("orber_ifr.hrl").-include("ifr_objects.hrl").-include_lib("orber/include/ifr_types.hrl").-include_lib("orber/include/corba.hrl").%%%======================================================================%%% Contained (IRObject)%%%----------------------------------------------------------------------%%% Interfaces inherited from IRObject'_get_def_kind'({ObjType,ObjID}) ->    orber_ifr_irobject:'_get_def_kind'({ObjType,ObjID}).%%% Note, that the destroy function is meant to be called within a%%% transaction called in the destroy function of an object which%%% inherits from Contained. A Contained should only be destroyed by%%% destroying the object that inherits from a Contained. An attempt%%% to call this function in user code will result in unpredictable%%% results.%%% Don't type check the object reference. We need to be able to%%% handle several types of objects that inherit from Contained.destroy(Contained_objref) ->    ObjList = cleanup_for_destroy(Contained_objref),    orber_ifr_irobject:destroy([Contained_objref | ObjList]).cleanup_for_destroy(Contained_objref) ->    Defined_in = '_get_defined_in'(Contained_objref),    [Container_obj] = mnesia:read(Defined_in),    New_container_obj =	construct(Container_obj,contents,		  lists:filter(fun(X) -> X /= Contained_objref end,			       select(Container_obj,contents))),    [fun() -> mnesia:write(New_container_obj) end].    %%%----------------------------------------------------------------------%%% Non-inherited interfaces'_get_id'({ObjType,ObjID}) ->    get_field({ObjType,ObjID},id).'_set_id'({ObjType,ObjID}, EO_Value) ->    set_field({ObjType, ObjID}, id, EO_Value).'_get_name'({ObjType,ObjID}) ->    get_field({ObjType,ObjID},name).'_set_name'({ObjType,ObjID}, EO_Value) ->    set_field({ObjType, ObjID}, name, EO_Value).'_get_version'({ObjType,ObjID}) ->    get_field({ObjType,ObjID},version).'_set_version'({ObjType,ObjID}, EO_Value) ->    set_field({ObjType, ObjID}, version, EO_Value).'_get_defined_in'({ObjType,ObjID}) ->    get_field({ObjType,ObjID},defined_in).'_get_absolute_name'({ObjType,ObjID}) ->    get_field({ObjType,ObjID},absolute_name).'_get_containing_repository'({ObjType,ObjID}) ->    get_field({ObjType,ObjID},containing_repository).describe(ObjRef) ->    Def_kind = '_get_def_kind'(ObjRef),    Object = get_object(ObjRef),    describe(Object,Def_kind).describe(Object,Def_kind) ->    Value =	case Def_kind of	    dk_Module ->		#moduledescription{name = Object#ir_ModuleDef.name,				   id = Object#ir_ModuleDef.id,				   defined_in = Object#ir_ModuleDef.defined_in,				   version = Object#ir_ModuleDef.version};	    dk_Constant ->		#constantdescription{name = Object#ir_ConstantDef.name,				     id = Object#ir_ConstantDef.id,				     defined_in =				     Object#ir_ConstantDef.defined_in,				     version = Object#ir_ConstantDef.version,				     type = Object#ir_ConstantDef.type,				     value = Object#ir_ConstantDef.value};	    dk_Typedef ->		#typedescription{name = Object#ir_TypedefDef.name,				 id = Object#ir_TypedefDef.id,				 defined_in = Object#ir_TypedefDef.defined_in,				 version = Object#ir_TypedefDef.version,				 type = Object#ir_TypedefDef.type};	    dk_Struct ->		?make_typedescription(Object,ir_StructDef);	    dk_Union ->		?make_typedescription(Object,ir_UnionDef);	    dk_Enum ->		?make_typedescription(Object,ir_EnumDef);	    dk_Alias ->		?make_typedescription(Object,ir_AliasDef);	    dk_Exception ->		#exceptiondescription{name = Object#ir_ExceptionDef.name,				      id = Object#ir_ExceptionDef.id,				      defined_in =				      Object#ir_ExceptionDef.defined_in,				      version = Object#ir_ExceptionDef.version,				      type = Object#ir_ExceptionDef.type};	    dk_Attribute ->		#attributedescription{name = Object#ir_AttributeDef.name,				      id = Object#ir_AttributeDef.id,				      defined_in =				      Object#ir_AttributeDef.defined_in,				      version = Object#ir_AttributeDef.version,				      type = Object#ir_AttributeDef.type,				      mode = Object#ir_AttributeDef.mode};	    dk_Operation ->		#operationdescription{name = Object#ir_OperationDef.name,				      id = Object#ir_OperationDef.id,				      defined_in =				      Object#ir_OperationDef.defined_in,				      version = Object#ir_OperationDef.version,				      result = Object#ir_OperationDef.result,				      mode = Object#ir_OperationDef.mode,				      contexts =				      Object#ir_OperationDef.contexts,				      parameters =				      Object#ir_OperationDef.params,				      exceptions =				      Object#ir_OperationDef.exceptions};	    dk_Interface ->		#interfacedescription{name = Object#ir_InterfaceDef.name,				      id = Object#ir_InterfaceDef.id,				      defined_in =				      Object#ir_InterfaceDef.defined_in,				      version = Object#ir_InterfaceDef.version,				      base_interfaces =				      Object#ir_InterfaceDef.base_interfaces};	    _ ->		undefined	end,    #contained_description{kind=Def_kind, value=Value}.move({ObjType,ObjID},{NewContainerType,NewContainerID},New_name,New_version) ->    Move_OK =	('_get_containing_repository'({NewContainerType,NewContainerID}) ==	 '_get_containing_repository'({ObjType,ObjID}))        and	case NewContainerType of	    ir_Repository ->		lists:member(ObjType,[ir_ConstantDef,ir_TypedefDef,				      ir_ExceptionDef,ir_InterfaceDef,				      ir_ModuleDef]);	    ir_ModuleDef ->		lists:member(ObjType,[ir_ConstantDef,ir_TypedefDef,				      ir_ExceptionDef,ir_ModuleDef,				      ir_InterfaceDef]);	    ir_InterfaceDef ->		lists:member(ObjType,[ir_ConstantDef,ir_TypedefDef,				      ir_ExceptionDef,ir_AttributeDef,				      ir_OperationDef]);	    _ ->		false	end	and	(orber_ifr_container:lookup_name({NewContainerType,NewContainerID},					 New_name, -1, % *** -1?					 dk_All, false) == []),    move(Move_OK,{ObjType,ObjID},{NewContainerType,NewContainerID},New_name,	 New_version).move(true, Contained_objref, New_container, New_name, New_version) ->    F = fun() -> Defined_in = '_get_defined_in'(Contained_objref),		 [Old_container_obj] = mnesia:read(Defined_in),		 New_old_container_obj =		     construct(Old_container_obj,contents,			       lists:filter(fun(X) -> X /= Contained_objref					    end, select(Old_container_obj,							contents))),		 New_container_obj = mnesia:read(New_container),		 Contents = orber_ifr_container:contents(New_container, dk_All,							 true),		 New_new_container_obj =		     construct(construct(construct(New_container_obj, contents,					   [Contained_objref | Contents]),					 name,New_name),version,New_version),		 mnesia:write(New_old_container_obj),		 mnesia:write(New_new_container_obj)	end,    write_result(ifr_transaction_read_write(F));move(false, _Contained_objref, _New_container, _New_name, _New_version) ->    corba:raise(#'INTF_REPOS'{completion_status=?COMPLETED_NO}).

⌨️ 快捷键说明

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