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