Merge branch 'master' of congo:dev/ohcount
[ohcount] / test / expected_dir / erl1.erl
1 erlang  comment %%%----------------------------------------------------------------------
2 erlang  comment %%% File    : erl1.erl
3 erlang  comment %%% Author  : Jason Allen <jason@ohloh.net> - kinda - just repurposing random code
4 erlang  comment %%% Purpose : Test out the erlang parsing
5 erlang  comment %%% Created : 1/17/2007 by Jason Allen <jason@ohloh.net>
6 erlang  comment %%% Id      : $Id: erl1.erl 1 2007-17-01 jason $
7 erlang  comment %%%----------------------------------------------------------------------
8 erlang  blank   
9 erlang  code    -module(erl1).
10 erlang  code    -author('jason@ohloh.net').
11 erlang  code    -vsn('$Revision: 1 $ ').
12 erlang  blank   
13 erlang  comment %% External exports
14 erlang  code    -export([import_file/1,
15 erlang  code             import_dir/1]).
16 erlang  blank   
17 erlang  code    -include("random.hrl").
18 erlang  code    -include("more_random.hrl").
19 erlang  blank   
20 erlang  comment %%%----------------------------------------------------------------------
21 erlang  comment %%% API
22 erlang  comment %%%----------------------------------------------------------------------
23 erlang  blank   
24 erlang  code    import_file(File) ->
25 erlang  code        User = filename:rootname(filename:basename(File)),
26 erlang  code        Server = filename:basename(filename:dirname(File)),
27 erlang  code        case (jlib:nodeprep(User) /= error) andalso
28 erlang  code            (jlib:nameprep(Server) /= error) of
29 erlang  code            true ->
30 erlang  code                case file:read_file(File) of
31 erlang  code                    {ok, Text} ->
32 erlang  code                        case xml_stream:parse_element(Text) of
33 erlang  code                            El when element(1, El) == xmlelement ->
34 erlang  code                                case catch process_xdb(User, Server, El) of
35 erlang  code                                    {'EXIT', Reason} ->
36 erlang  code                                        ?ERROR_MSG(
37 erlang  code                                           "Error while processing file \"~s\": ~p~n",
38 erlang  code                                           [File, Reason]),
39 erlang  code                                           {error, Reason};
40 erlang  code                                    _ ->
41 erlang  code                                        ok
42 erlang  code                                end;
43 erlang  code                            {error, Reason} ->
44 erlang  code                                ?ERROR_MSG("Can't parse file \"~s\": ~p~n",
45 erlang  code                                           [File, Reason]),
46 erlang  code                                {error, Reason}
47 erlang  code                        end;
48 erlang  code                    {error, Reason} ->
49 erlang  code                        ?ERROR_MSG("Can't read file \"~s\": ~p~n", [File, Reason]),
50 erlang  code                        {error, Reason}
51 erlang  code                end;
52 erlang  code            false ->
53 erlang  code                ?ERROR_MSG("Illegal user/server name in file \"~s\"~n", [File]),
54 erlang  code                {error, "illegal user/server"}
55 erlang  code        end.
56 erlang  blank   
57 erlang  blank   
58 erlang  code    import_dir(Dir) ->
59 erlang  code        {ok, Files} = file:list_dir(Dir),
60 erlang  code        MsgFiles = lists:filter(
61 erlang  code                     fun(FN) ->
62 erlang  code                             case string:len(FN) > 4 of
63 erlang  code                                 true ->
64 erlang  code                                     string:substr(FN,
65 erlang  code                                                   string:len(FN) - 3) == ".xml";
66 erlang  code                                 _ ->
67 erlang  code                                     false
68 erlang  code                             end
69 erlang  code                     end, Files),
70 erlang  code        lists:foldl(
71 erlang  code          fun(FN, A) ->
72 erlang  code                  Res = import_file(filename:join([Dir, FN])),
73 erlang  code                  case {A, Res} of
74 erlang  code                      {ok, ok} -> ok;
75 erlang  code                      {ok, _} -> {error, "see aoabberd log for details"};
76 erlang  code                      _ -> A
77 erlang  code                  end
78 erlang  code          end, ok, MsgFiles).
79 erlang  blank   
80 erlang  comment %%%----------------------------------------------------------------------
81 erlang  comment %%% Internal functions
82 erlang  comment %%%----------------------------------------------------------------------
83 erlang  blank   
84 erlang  code    process_xdb(User, Server, {xmlelement, Name, _Attrs, Els}) ->
85 erlang  code        case Name of
86 erlang  code            "xdb" ->
87 erlang  code                lists:foreach(
88 erlang  code                  fun(El) ->
89 erlang  code                          xdb_data(User, Server, El)
90 erlang  code                  end, Els);
91 erlang  code            _ ->
92 erlang  code                ok
93 erlang  code        end.
94 erlang  blank   
95 erlang  blank   
96 erlang  code    xdb_data(User, Server, {xmlcdata, _CData}) ->
97 erlang  code        ok;
98 erlang  code    xdb_data(User, Server, {xmlelement, _Name, Attrs, _Els} = El) ->
99 erlang  code        From = jlib:make_jid(User, Server, ""),
100 erlang  code        LServer = jlib:nameprep(Server),
101 erlang  code        case xml:get_attr_s("xmlns", Attrs) of
102 erlang  code            ?NS_AUTH ->
103 erlang  code                Password = xml:get_tag_cdata(El),
104 erlang  code                ejabberd_auth:set_password(User, Server, Password),
105 erlang  code                ok;
106 erlang  code            ?NS_ROSTER ->
107 erlang  code                case lists:member(mod_roster_odbc,
108 erlang  code                                  gen_mod:loaded_modules(LServer)) of
109 erlang  code                    true ->
110 erlang  code                        catch mod_roster_odbc:set_items(User, Server, El);
111 erlang  code                    false ->
112 erlang  code                        catch mod_roster:set_items(User, Server, El)
113 erlang  code                end,
114 erlang  code                ok;
115 erlang  code            ?NS_LAST ->
116 erlang  code                TimeStamp = xml:get_attr_s("last", Attrs),
117 erlang  code                Status = xml:get_tag_cdata(El),
118 erlang  code                case lists:member(mod_last_odbc,
119 erlang  code                                  gen_mod:loaded_modules(LServer)) of
120 erlang  code                    true ->
121 erlang  code                        catch mod_last_odbc:store_last_info(
122 erlang  code                                User,
123 erlang  code                                Server,
124 erlang  code                                list_to_integer(TimeStamp),
125 erlang  code                                Status);
126 erlang  code                    false ->
127 erlang  code                        catch mod_last:store_last_info(
128 erlang  code                                User,
129 erlang  code                                Server,
130 erlang  code                                list_to_integer(TimeStamp),
131 erlang  code                                Status)
132 erlang  code                end,
133 erlang  code                ok;
134 erlang  code            ?NS_VCARD ->
135 erlang  code                case lists:member(mod_vcard_odbc,
136 erlang  code                                  gen_mod:loaded_modules(LServer)) of
137 erlang  code                    true ->
138 erlang  code                        catch mod_vcard_odbc:process_sm_iq(
139 erlang  code                                From,
140 erlang  code                                jlib:make_jid("", Server, ""),
141 erlang  code                                #iq{type = set, xmlns = ?NS_VCARD, sub_el = El});
142 erlang  code                    false ->
143 erlang  code                        catch mod_vcard:process_sm_iq(
144 erlang  code                                From,
145 erlang  code                                jlib:make_jid("", Server, ""),
146 erlang  code                                #iq{type = set, xmlns = ?NS_VCARD, sub_el = El})
147 erlang  code                end,
148 erlang  code                ok;
149 erlang  code            "jabber:x:offline" ->
150 erlang  code                process_offline(Server, From, El),
151 erlang  code                ok;
152 erlang  code            XMLNS ->
153 erlang  code                case xml:get_attr_s("j_private_flag", Attrs) of
154 erlang  code                    "1" ->
155 erlang  code                        catch mod_private:process_sm_iq(
156 erlang  code                                From,
157 erlang  code                                jlib:make_jid("", Server, ""),
158 erlang  code                                #iq{type = set, xmlns = ?NS_PRIVATE,
159 erlang  code                                    sub_el = {xmlelement, "query", [],
160 erlang  code                                              [jlib:remove_attr(
161 erlang  code                                                 "j_private_flag",
162 erlang  code                                                 jlib:remove_attr("xdbns", El))]}});
163 erlang  code                    _ ->
164 erlang  code                        ?DEBUG("jd2ejd: Unknown namespace \"~s\"~n", [XMLNS])
165 erlang  code                end,
166 erlang  code                ok
167 erlang  code        end.
168 erlang  blank   
169 erlang  blank   
170 erlang  code    process_offline(Server, To, {xmlelement, _, _, Els}) ->
171 erlang  code        LServer = jlib:nameprep(Server),
172 erlang  code        lists:foreach(fun({xmlelement, _, Attrs, _} = El) ->
173 erlang  code                              FromS = xml:get_attr_s("from", Attrs),
174 erlang  code                              From = case FromS of
175 erlang  code                                         "" ->
176 erlang  code                                             jlib:make_jid("", Server, "");
177 erlang  code                                         _ ->
178 erlang  code                                             jlib:string_to_jid(FromS)
179 erlang  code                                     end,
180 erlang  code                              case From of
181 erlang  code                                  error ->
182 erlang  code                                      ok;
183 erlang  code                                  _ ->
184 erlang  code                                      ejabberd_hooks:run(offline_message_hook,
185 erlang  code                                                         LServer,
186 erlang  code                                                         [From, To, El])
187 erlang  code                              end
188 erlang  code                      end, Els).
189 erlang  blank