%%-------------------------------------------------------------------- %% %% %CopyrightBegin% %% %% Copyright Ericsson AB 2000-2015. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions 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) -> Time = erlang:system_time(), Unique = erlang:unique_integer([positive]), lists:concat(['oe_',node(),'_',Type,'_',Time,'_',Unique]). %%--------------- END OF MODULE ------------------------------