aboutsummaryrefslogtreecommitdiffstats
path: root/lib/cosProperty/src/cosProperty.erl
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
committerErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
commit84adefa331c4159d432d22840663c38f155cd4c1 (patch)
treebff9a9c66adda4df2106dfd0e5c053ab182a12bd /lib/cosProperty/src/cosProperty.erl
downloadotp-84adefa331c4159d432d22840663c38f155cd4c1.tar.gz
otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.bz2
otp-84adefa331c4159d432d22840663c38f155cd4c1.zip
The R13B03 release.OTP_R13B03
Diffstat (limited to 'lib/cosProperty/src/cosProperty.erl')
-rw-r--r--lib/cosProperty/src/cosProperty.erl414
1 files changed, 414 insertions, 0 deletions
diff --git a/lib/cosProperty/src/cosProperty.erl b/lib/cosProperty/src/cosProperty.erl
new file mode 100644
index 0000000000..2368ee3db6
--- /dev/null
+++ b/lib/cosProperty/src/cosProperty.erl
@@ -0,0 +1,414 @@
+%%--------------------------------------------------------------------
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2000-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 : cosProperty.erl
+%% Purpose :
+%%----------------------------------------------------------------------
+
+-module(cosProperty).
+
+%%--------------- INCLUDES -----------------------------------
+-include("cosProperty.hrl").
+-include_lib("cosProperty/include/CosPropertyService.hrl").
+
+%%--------------- EXPORTS-------------------------------------
+%% cosProperty API external
+-export([start/0,
+ start_SetDefFactory/0,
+ start_SetFactory/0,
+ stop_SetDefFactory/1,
+ stop_SetFactory/1,
+ stop/0,
+ install/0,
+ install/1,
+ install_db/0,
+ install_db/1,
+ install_db/2,
+ uninstall/0,
+ uninstall/1,
+ uninstall_db/0]).
+
+%% cosProperty API internal
+-export([create_link/3,
+ get_option/3,
+ type_check/2,
+ query_result/1,
+ start_PropertiesIterator/1,
+ start_PropertyNamesIterator/1,
+ create_static_SetDef/2]).
+
+%% Application callbacks
+-export([start/2, init/1, stop/1]).
+
+%%--------------- DEFINES ------------------------------------
+
+-define(SUPERVISOR_NAME, oe_cosPropertySup).
+-define(SUP_FLAG, {simple_one_for_one,50,10}).
+-define(SUP_PROP_SPEC(T,I),
+ ['CosPropertyService_PropertiesIterator',I,
+ [{sup_child, true}, {regname, {global, T}}]]).
+-define(SUP_NAMES_SPEC(T,I),
+ ['CosPropertyService_PropertyNamesIterator',I,
+ [{sup_child, true}, {regname, {global, T}}]]).
+-define(SUP_CHILD,
+ {"oe_PropertyChild",
+ {cosProperty,create_link, []},
+ transient,100000,worker,
+ []}).
+
+%%------------------------------------------------------------
+%% function : install
+%% Arguments: -
+%% Returns : ok | EXIT | EXCEPTION
+%% Effect : Install necessary data in the IFR DB
+%%------------------------------------------------------------
+install() ->
+ install([]).
+install(_Options) ->
+ case catch oe_CosProperty:'oe_register'() of
+ ok ->
+ ok;
+ {'EXIT',{unregistered,App}} ->
+ ?write_ErrorMsg("Unable to register cosProperty; application ~p not registered.~n",
+ [App]),
+ exit({unregistered,App});
+ {'EXCEPTION',_} ->
+ ?write_ErrorMsg("Unable to register cosProperty; propably already registered.
+You are adviced to confirm this.~n", []),
+ exit({error, "Register in the IFR failed."});
+ Reason ->
+ ?write_ErrorMsg("Unable to register cosProperty; reason ~p", [Reason]),
+ exit({error, "Register in the IFR failed."})
+ end.
+
+%%------------------------------------------------------------
+%% function : install_db
+%% Arguments: -
+%% Returns : ok | EXIT | EXCEPTION
+%% Effect : Install necessary data in the IFR DB
+%%------------------------------------------------------------
+install_db() ->
+ install_db(infinity, []).
+install_db(Timeout) ->
+ install_db(Timeout, []).
+install_db(Timeout, Options) ->
+ case install_table(Timeout, Options) of
+ ok ->
+ ok;
+ {error, [DB_tables_created, Wait]} ->
+ ?write_ErrorMsg("Able to register cosProperty but failed adding table in mnesia (~p, ~p)",
+ [DB_tables_created, Wait]),
+ exit({error, "Adding data in mnesia failed."});
+ Why ->
+ ?write_ErrorMsg("Able to register cosProperty but failed adding table in mnesia with reason ~p",
+ [Why]),
+ exit({error, "Adding data in mnesia failed."})
+ end.
+
+%%------------------------------------------------------------
+%% function : install_table
+%% Arguments: -
+%% Returns : ok | {error, Data}
+%% Effect : Install necessary data in mnesia
+%%------------------------------------------------------------
+install_table(Timeout, Options) ->
+ %% Fetch a list of the defined tables to see if 'oe_CosPropertyService'
+ %% is defined.
+ AllTabs = mnesia:system_info(tables),
+ DB_tables_created =
+ case lists:member('oe_CosPropertyService', AllTabs) of
+ true ->
+ case lists:member({local_content, true},
+ Options) of
+ true->
+ mnesia:add_table_copy('oe_CosPropertyService',
+ node(),
+ ram_copies);
+ _->
+ mnesia:create_table('oe_CosPropertyService',[{attributes,
+ record_info(fields,
+ 'oe_CosPropertyService')}
+ |Options])
+ end;
+ _ ->
+ mnesia:create_table('oe_CosPropertyService',[{attributes,
+ record_info(fields,
+ 'oe_CosPropertyService')}
+ |Options])
+ end,
+ Wait = mnesia:wait_for_tables(['oe_CosPropertyService'], Timeout),
+ %% Check if any error has occured yet. If there are errors, return them.
+ if
+ DB_tables_created == {atomic, ok},
+ Wait == ok ->
+ ok;
+ true ->
+ {error, [DB_tables_created, Wait]}
+ end.
+
+
+%%------------------------------------------------------------
+%% function : query_result
+%% Arguments: -
+%% Returns : error | Data
+%% Effect : Check a read transaction
+%%------------------------------------------------------------
+query_result(Qres) ->
+ case Qres of
+ {atomic, [Hres]} ->
+ Hres#oe_CosPropertyService.properties;
+ {atomic, [_Hres | _Tres]} ->
+ error;
+ {atomic, []} ->
+ error;
+ _Other ->
+ error
+ end.
+
+%%------------------------------------------------------------
+%% function : uninstall
+%% Arguments: -
+%% Returns : ok | EXIT | EXCEPTION
+%% Effect : Remove data related to cosProperty from the IFR DB
+%%------------------------------------------------------------
+uninstall() ->
+ uninstall([]).
+uninstall(_Options) ->
+ application:stop(cosProperty),
+ oe_CosProperty:oe_unregister().
+
+%%------------------------------------------------------------
+%% function : uninstall
+%% Arguments: -
+%% Returns : ok | EXIT | EXCEPTION
+%% Effect : Remove data related to cosProperty from the IFR DB
+%%------------------------------------------------------------
+uninstall_db() ->
+ application:stop(cosProperty),
+ case mnesia:delete_table('oe_CosPropertyService') of
+ {atomic, ok} ->
+ ok;
+ {aborted, _Reason} ->
+ exit({error, "Removing data from mnesia failed."})
+ end.
+
+%%------------------------------------------------------------
+%% function : create_static_SetDef
+%% Arguments:
+%% Returns :
+%% Effect : Starts or stops the cosProperty application.
+%%------------------------------------------------------------
+create_static_SetDef(PropTypes, PropDefs) ->
+ InitProps = propertyDef2local(PropDefs, []),
+ 'CosPropertyService_PropertySetDef':oe_create({static, fixed_readonly, PropTypes,
+ PropDefs, InitProps,
+ ?PropertySetDef},
+ [{pseudo, true}]).
+propertyDef2local([#'CosPropertyService_PropertyDef'
+ {property_name = Name,
+ property_value = Value,
+ property_mode = fixed_readonly}|T], Acc) ->
+ propertyDef2local(T, [{Name, Value, fixed_readonly}|Acc]);
+propertyDef2local([], Acc) ->
+ Acc;
+propertyDef2local(_, _) ->
+ exit({error, "Bad Mode type supplied. Must be fixed_readonly"}).
+
+%%------------------------------------------------------------
+%% function : start/stop
+%% Arguments:
+%% Returns :
+%% Effect : Starts or stops the cosProperty application.
+%%------------------------------------------------------------
+start() ->
+ application:start(cosProperty).
+stop() ->
+ application:stop(cosProperty).
+
+
+
+%%-----------------------------------------------------------%
+%% function : start_SetDefFactory
+%% Arguments: -
+%% Returns : A PropertySetDefFactory reference.
+%% Effect :
+%%------------------------------------------------------------
+start_SetDefFactory() ->
+ 'CosPropertyService_PropertySetDefFactory':oe_create([], [{pseudo, true}]).
+
+%%-----------------------------------------------------------%
+%% function : start_SetFactory
+%% Arguments: -
+%% Returns : A PropertySetFactory reference.
+%% Effect :
+%%------------------------------------------------------------
+start_SetFactory() ->
+ 'CosPropertyService_PropertySetFactory':oe_create([], [{pseudo, true}]).
+
+%%-----------------------------------------------------------%
+%% function : stop_SetDefFactory
+%% Arguments: Factory - A PropertySetDefFactory reference.
+%% Returns :
+%% Effect :
+%%------------------------------------------------------------
+stop_SetDefFactory(Factory) ->
+ corba:dispose(Factory).
+
+%%-----------------------------------------------------------%
+%% function : stop_SetFactory
+%% Arguments: Factory - A PropertySetFactory reference.
+%% Returns :
+%% Effect :
+%%------------------------------------------------------------
+stop_SetFactory(Factory) ->
+ corba:dispose(Factory).
+
+%%------------------------------------------------------------
+%% function : start
+%% Arguments: Type - see module application
+%% Arg - see module application
+%% Returns :
+%% Effect : Module callback for application
+%%------------------------------------------------------------
+start(_, _) ->
+ supervisor:start_link({local, ?SUPERVISOR_NAME}, cosProperty, app_init).
+
+
+%%------------------------------------------------------------
+%% function : stop
+%% Arguments: Arg - see module application
+%% Returns :
+%% Effect : Module callback for application
+%%------------------------------------------------------------
+stop(_) ->
+ ok.
+
+%%-----------------------------------------------------------%
+%% function : init
+%% Arguments:
+%% Returns :
+%% Effect :
+%%------------------------------------------------------------
+%% Starting using create_factory/X
+init(own_init) ->
+ {ok,{?SUP_FLAG, [?SUP_CHILD]}};
+%% When starting as an application.
+init(app_init) ->
+ {ok,{?SUP_FLAG, [?SUP_CHILD]}}.
+
+%%-----------------------------------------------------------%
+%% function : create_link
+%% Arguments: Module - which Module to call
+%% Env/ArgList - ordinary oe_create arguments.
+%% Returns :
+%% Exception:
+%% Effect : Necessary since we want the supervisor to be a
+%% 'simple_one_for_one'. Otherwise, using for example,
+%% 'one_for_one', we have to call supervisor:delete_child
+%% to remove the childs startspecification from the
+%% supervisors internal state.
+%%------------------------------------------------------------
+create_link(Module, Env, ArgList) ->
+ Module:oe_create_link(Env, ArgList).
+
+%%-----------------------------------------------------------%
+%% function : start_PropertiesIterator
+%% Arguments:
+%% Returns :
+%% Exception:
+%% Effect :
+%%------------------------------------------------------------
+start_PropertiesIterator(Args) ->
+ Name = create_name(propertiesIterator),
+ case supervisor:start_child(?SUPERVISOR_NAME, ?SUP_PROP_SPEC(Name, Args)) of
+ {ok, Pid, Obj} when is_pid(Pid) ->
+ Obj;
+ _Other->
+ corba:raise(#'INTERNAL'{completion_status=?COMPLETED_NO})
+ end.
+
+%%-----------------------------------------------------------%
+%% function : start_PropertyNamesIterator
+%% Arguments:
+%% Returns :
+%% Exception:
+%% Effect :
+%%------------------------------------------------------------
+start_PropertyNamesIterator(Args) ->
+ Name = create_name(propertiesIterator),
+ case supervisor:start_child(?SUPERVISOR_NAME, ?SUP_NAMES_SPEC(Name, Args)) of
+ {ok, Pid, Obj} when is_pid(Pid) ->
+ Obj;
+ _Other->
+ corba:raise(#'INTERNAL'{completion_status=?COMPLETED_NO})
+ end.
+
+
+%%-----------------------------------------------------------%
+%% function : get_option
+%% Arguments:
+%% Returns :
+%% Exception:
+%% Effect :
+%%------------------------------------------------------------
+get_option(Key, OptionList, DefaultList) ->
+ case lists:keysearch(Key, 1, OptionList) of
+ {value,{Key,Value}} ->
+ Value;
+ _ ->
+ case lists:keysearch(Key, 1, DefaultList) of
+ {value,{Key,Value}} ->
+ Value;
+ _->
+ {error, "Invalid option"}
+ end
+ end.
+
+%%-----------------------------------------------------------%
+%% function : type_check
+%% Arguments: Obj - objectrefernce to test.
+%% Mod - Module which contains typeID/0.
+%% Returns : 'ok' or raises exception.
+%% Effect :
+%%------------------------------------------------------------
+type_check(Obj, Mod) ->
+ case catch corba_object:is_a(Obj,Mod:typeID()) of
+ true ->
+ ok;
+ _ ->
+ corba:raise(#'BAD_PARAM'{completion_status=?COMPLETED_NO})
+ end.
+
+
+%%-----------------------------------------------------------%
+%% function : create_name/1
+%% Arguments:
+%% Returns :
+%% Exception:
+%% Effect :
+%%------------------------------------------------------------
+create_name(Type) ->
+ {MSec, Sec, USec} = erlang:now(),
+ lists:concat(['oe_',node(),'_',Type,'_',MSec, '_', Sec, '_', USec]).
+
+%%--------------- END OF MODULE ------------------------------
+
+