diff options
Diffstat (limited to 'lib/common_test/src/ct_config_xml.erl')
-rwxr-xr-x | lib/common_test/src/ct_config_xml.erl | 96 |
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. |