aboutsummaryrefslogtreecommitdiffstats
path: root/lib/cosProperty/src/CosPropertyService_PropertySetFactory_impl.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/CosPropertyService_PropertySetFactory_impl.erl
downloadotp-84adefa331c4159d432d22840663c38f155cd4c1.tar.gz
otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.bz2
otp-84adefa331c4159d432d22840663c38f155cd4c1.zip
The R13B03 release.OTP_R13B03
Diffstat (limited to 'lib/cosProperty/src/CosPropertyService_PropertySetFactory_impl.erl')
-rw-r--r--lib/cosProperty/src/CosPropertyService_PropertySetFactory_impl.erl176
1 files changed, 176 insertions, 0 deletions
diff --git a/lib/cosProperty/src/CosPropertyService_PropertySetFactory_impl.erl b/lib/cosProperty/src/CosPropertyService_PropertySetFactory_impl.erl
new file mode 100644
index 0000000000..ad3cdb62d4
--- /dev/null
+++ b/lib/cosProperty/src/CosPropertyService_PropertySetFactory_impl.erl
@@ -0,0 +1,176 @@
+%%----------------------------------------------------------------------
+%%
+%% %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 : CosPropertyService_PropertySetFactory_impl.erl
+%% Description :
+%%
+%%----------------------------------------------------------------------
+-module('CosPropertyService_PropertySetFactory_impl').
+
+%%----------------------------------------------------------------------
+%% Include files
+%%----------------------------------------------------------------------
+-include_lib("orber/include/corba.hrl").
+-include_lib("orber/src/orber_iiop.hrl").
+-include("CosPropertyService.hrl").
+-include("cosProperty.hrl").
+
+%%----------------------------------------------------------------------
+%% External exports
+%%----------------------------------------------------------------------
+-export([init/1,
+ terminate/2,
+ code_change/3]).
+
+-export([create_propertyset/2,
+ create_constrained_propertyset/4,
+ create_initial_propertyset/3]).
+
+
+%%----------------------------------------------------------------------
+%% Internal exports
+%%----------------------------------------------------------------------
+-export([]).
+
+%%----------------------------------------------------------------------
+%% Records
+%%----------------------------------------------------------------------
+-record(state, {}).
+
+%%----------------------------------------------------------------------
+%% Macros
+%%----------------------------------------------------------------------
+-define(checkTCfun, fun(TC) -> orber_tc:check_tc(TC) end).
+
+%%======================================================================
+%% External functions
+%%======================================================================
+%%----------------------------------------------------------------------
+%% Function : init/1
+%% Returns : {ok, State} |
+%% {ok, State, Timeout} |
+%% ignore |
+%% {stop, Reason}
+%% Description: Initiates the server
+%%----------------------------------------------------------------------
+init([]) ->
+ {ok, #state{}}.
+
+%%----------------------------------------------------------------------
+%% Function : terminate/2
+%% Returns : any (ignored by gen_server)
+%% Description: Shutdown the server
+%%----------------------------------------------------------------------
+terminate(_Reason, _State) ->
+ ok.
+
+%%----------------------------------------------------------------------
+%% Function : code_change/3
+%% Returns : {ok, NewState}
+%% Description: Convert process state when code is changed
+%%----------------------------------------------------------------------
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
+
+%%----------------------------------------------------------------------
+%% Function : create_propertyset
+%% Arguments :
+%% Returns : CosPropertyService::PropertySet reference.
+%% Description:
+%%----------------------------------------------------------------------
+create_propertyset(_OE_This, State) ->
+ {reply,
+ 'CosPropertyService_PropertySetDef':
+ oe_create({normal, [], [], [], ?PropertySet}, [{pseudo, true}]),
+ State}.
+
+%%----------------------------------------------------------------------
+%% Function : create_constrained_propertyset
+%% Arguments : PropTypes - list of property types.
+%% Properties - list of properties.
+%% Returns : CosPropertyService::PropertySet |
+%% {'EXCEPTION', CosPropertyService::ConstraintNotSupported}
+%% Description:
+%%----------------------------------------------------------------------
+create_constrained_propertyset(_OE_This, State, PropTypes, Properties) ->
+ case lists:all(?checkTCfun, PropTypes) of
+ true ->
+ crosscheckTC(Properties, PropTypes),
+ {reply,
+ 'CosPropertyService_PropertySetDef':
+ oe_create({normal, PropTypes, Properties, [], ?PropertySet},
+ [{pseudo, true}]),
+ State};
+ false ->
+ corba:raise(#'CosPropertyService_ConstraintNotSupported'{})
+ end.
+
+crosscheckTC([], _) ->
+ ok;
+crosscheckTC([#'CosPropertyService_Property'
+ {property_name = Name,
+ property_value = Value}|T], TCs) ->
+ case lists:member(any:get_typecode(Value), TCs) of
+ true when Name =/= "" ->
+ crosscheckTC(T, TCs);
+ _ ->
+ corba:raise(#'CosPropertyService_ConstraintNotSupported'{})
+ end.
+
+%%----------------------------------------------------------------------
+%% Function : create_initial_propertyset
+%% Arguments : Properties - list of properties.
+%% Returns : CosPropertyService::PropertySetDef |
+%% {'EXCEPTION', CosPropertyService::MultipleExceptions}
+%% Description:
+%%----------------------------------------------------------------------
+create_initial_propertyset(_OE_This, State, Properties) ->
+ InitProps = evaluate_propertyset(Properties),
+ {reply,
+ 'CosPropertyService_PropertySetDef':
+ oe_create({normal, [], [], InitProps, ?PropertySet}, [{pseudo, true}]),
+ State}.
+
+%%======================================================================
+%% Internal functions
+%%======================================================================
+evaluate_propertyset(Sets) ->
+ evaluate_propertyset(Sets, [], []).
+evaluate_propertyset([], NewProperties, []) ->
+ %% No exceptions found.
+ NewProperties;
+evaluate_propertyset([], _, Exc) ->
+ corba:raise(#'CosPropertyService_MultipleExceptions'{exceptions = Exc});
+evaluate_propertyset([#'CosPropertyService_Property'
+ {property_name = Name,
+ property_value = Value}|T], X, Exc) ->
+ case orber_tc:check_tc(any:get_typecode(Value)) of
+ true ->
+ evaluate_propertyset(T, [{Name, Value, normal}|X], Exc);
+ false ->
+ evaluate_propertyset(T, X, [#'CosPropertyService_PropertyException'
+ {reason = unsupported_type_code,
+ failing_property_name = Name}|Exc])
+ end.
+
+%%======================================================================
+%% END OF MODULE
+%%======================================================================