aboutsummaryrefslogtreecommitdiffstats
path: root/lib/common_test/src/ct_config_xml.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/common_test/src/ct_config_xml.erl')
-rwxr-xr-xlib/common_test/src/ct_config_xml.erl96
1 files changed, 96 insertions, 0 deletions
diff --git a/lib/common_test/src/ct_config_xml.erl b/lib/common_test/src/ct_config_xml.erl
new file mode 100755
index 0000000000..ef991123f3
--- /dev/null
+++ b/lib/common_test/src/ct_config_xml.erl
@@ -0,0 +1,96 @@
+%%--------------------------------------------------------------------
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010. 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 : ct_config_xml.erl
+%% Description : CT callback module for reading configs from XML files
+%%
+%% Created : 16 February 2010
+%%----------------------------------------------------------------------
+-module(ct_config_xml).
+-export([read_config_file/1, list_to_term/1]).
+
+read_config_file(ConfigFile) ->
+ case catch do_read_xml_config(ConfigFile) of
+ {ok, Config}->
+ {ok, Config};
+ {error, Error, ErroneousString}->
+ {error, Error, ErroneousString}
+ end.
+
+do_read_xml_config(ConfigFile)->
+ {ok, EntityList, _}=
+ xmerl_sax_parser:file(ConfigFile,
+ [{event_fun, fun event/3},
+ {event_state, initial_state()}]),
+ {ok, transform_entity_list(EntityList)}.
+
+
+initial_state() ->
+ [].
+
+event(Event, _LineNo, State) ->
+ tag(Event, State).
+
+tag(startDocument, State) ->
+ State;
+
+tag(endDocument, {_Tags, Result}) ->
+ Result;
+
+tag({startElement, _Uri, "config", _QName, _Attributes}, []) ->
+ [{"config", []}];
+
+tag({endElement, _Uri, "config", _QName}, [{"config", Config}]) ->
+ Config;
+
+tag({startElement, _Uri, Name, _QName, _Attributes}, Tags) ->
+ [{Name, []}|Tags];
+
+tag({endElement, _Uri, _Name, _QName},
+ [Entity, {PrevEntityTag, PrevEntityValue}|Tags]) ->
+ NewHead = {PrevEntityTag, [Entity|PrevEntityValue]},
+ [NewHead|Tags];
+
+tag({characters, String}, [{Tag, _Value}|Tags]) ->
+ [{Tag, String}|Tags];
+
+tag(_El, State) ->
+ State.
+
+transform_entity_list(EntityList)->
+ lists:map(fun transform_entity/1, EntityList).
+
+transform_entity({Tag, [Value|Rest]}) when
+ is_tuple(Value)->
+ {list_to_atom(Tag), transform_entity_list([Value|Rest])};
+transform_entity({Tag, String})->
+ case list_to_term(String) of
+ {ok, Value}->
+ {list_to_atom(Tag), Value};
+ Error->
+ throw(Error)
+ end.
+
+list_to_term(String) ->
+ {ok, T, _} = erl_scan:string(String++"."),
+ case erl_parse:parse_term(T) of
+ {ok, Term} ->
+ {ok, Term};
+ Error ->
+ {error, Error, String}
+ end.