From 84adefa331c4159d432d22840663c38f155cd4c1 Mon Sep 17 00:00:00 2001 From: Erlang/OTP Date: Fri, 20 Nov 2009 14:54:40 +0000 Subject: The R13B03 release. --- lib/orber/src/orber_ifr_contained.erl | 247 ++++++++++++++++++++++++++++++++++ 1 file changed, 247 insertions(+) create mode 100644 lib/orber/src/orber_ifr_contained.erl (limited to 'lib/orber/src/orber_ifr_contained.erl') diff --git a/lib/orber/src/orber_ifr_contained.erl b/lib/orber/src/orber_ifr_contained.erl new file mode 100644 index 0000000000..21c72e3b72 --- /dev/null +++ b/lib/orber/src/orber_ifr_contained.erl @@ -0,0 +1,247 @@ +%%-------------------------------------------------------------------- +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-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 : orber_ifr_contained.erl +%% Purpose : Code for Contained +%%---------------------------------------------------------------------- + +-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}). -- cgit v1.2.3