From aa210166c4066ab03a35ca5e83322c908c11d969 Mon Sep 17 00:00:00 2001 From: Christophe Romain Date: Tue, 26 May 2009 21:50:13 +0000 Subject: [PATCH] improve get_entity_* to work regardless of nodetree (EJAB-937) SVN Revision: 2104 --- src/mod_pubsub/gen_pubsub_nodetree.erl | 1 + src/mod_pubsub/mod_pubsub.erl | 8 ++++--- src/mod_pubsub/node_default.erl | 30 +++++++++++------------- src/mod_pubsub/node_pep.erl | 32 ++++++++++++++++++-------- src/mod_pubsub/nodetree_default.erl | 7 ++++++ src/mod_pubsub/nodetree_virtual.erl | 5 +++- 6 files changed, 53 insertions(+), 30 deletions(-) diff --git a/src/mod_pubsub/gen_pubsub_nodetree.erl b/src/mod_pubsub/gen_pubsub_nodetree.erl index 941748e68..f012b3d0b 100644 --- a/src/mod_pubsub/gen_pubsub_nodetree.erl +++ b/src/mod_pubsub/gen_pubsub_nodetree.erl @@ -44,6 +44,7 @@ behaviour_info(callbacks) -> {set_node, 1}, {get_node, 3}, {get_node, 2}, + {get_node, 1}, {get_nodes, 2}, {get_nodes, 1}, {get_subnodes, 3}, diff --git a/src/mod_pubsub/mod_pubsub.erl b/src/mod_pubsub/mod_pubsub.erl index ca614bd92..43cf49f76 100644 --- a/src/mod_pubsub/mod_pubsub.erl +++ b/src/mod_pubsub/mod_pubsub.erl @@ -167,12 +167,12 @@ init([ServerHost, Opts]) -> IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue), ServerHostB = list_to_binary(ServerHost), pubsub_index:init(Host, ServerHost, Opts), + ets:new(gen_mod:get_module_proc(Host, pubsub_state), [set, named_table]), + ets:new(gen_mod:get_module_proc(ServerHost, pubsub_state), [set, named_table]), {Plugins, NodeTree, PepMapping} = init_plugins(Host, ServerHost, Opts), mod_disco:register_feature(ServerHost, ?NS_PUBSUB_s), - ets:new(gen_mod:get_module_proc(Host, pubsub_state), [set, named_table]), ets:insert(gen_mod:get_module_proc(Host, pubsub_state), {nodetree, NodeTree}), ets:insert(gen_mod:get_module_proc(Host, pubsub_state), {plugins, Plugins}), - ets:new(gen_mod:get_module_proc(ServerHost, pubsub_state), [set, named_table]), ets:insert(gen_mod:get_module_proc(ServerHost, pubsub_state), {nodetree, NodeTree}), ets:insert(gen_mod:get_module_proc(ServerHost, pubsub_state), {plugins, Plugins}), ets:insert(gen_mod:get_module_proc(ServerHost, pubsub_state), {pep_mapping, PepMapping}), @@ -3018,6 +3018,7 @@ tree_call(Host, Function, Args) -> end, catch apply(Module, Function, Args). tree_action(Host, Function, Args) -> + ?DEBUG("tree_action ~p ~p ~p",[Host,Function,Args]), Fun = fun() -> tree_call(Host, Function, Args) end, catch mnesia:sync_dirty(Fun). @@ -3037,7 +3038,8 @@ node_call(Type, Function, Args) -> Result -> {result, Result} %% any other return value is forced as result end. -node_action(_Host, Type, Function, Args) -> +node_action(Host, Type, Function, Args) -> + ?DEBUG("node_action ~p ~p ~p ~p",[Host,Type,Function,Args]), transaction(fun() -> node_call(Type, Function, Args) end, sync_dirty). diff --git a/src/mod_pubsub/node_default.erl b/src/mod_pubsub/node_default.erl index bd972b550..013b5c211 100644 --- a/src/mod_pubsub/node_default.erl +++ b/src/mod_pubsub/node_default.erl @@ -552,15 +552,14 @@ purge_node(NodeId, Owner) -> get_entity_affiliations(Host, Owner) -> GenKey = jlib:short_prepd_bare_jid(Owner), States = mnesia:match_object(#pubsub_state{stateid = {GenKey, '_'}, _ = '_'}), + NodeTree = case ets:lookup(gen_mod:get_module_proc(Host, pubsub_state), nodetree) of + [{nodetree, N}] -> N; + _ -> nodetree_default + end, Reply = lists:foldl(fun(#pubsub_state{stateid = {_, N}, affiliation = A}, Acc) -> - case mnesia:index_read(pubsub_node, N, #pubsub_node.id) of - [#pubsub_node{nodeid = {H, _}} = Node] -> - case H of - Host -> [{Node, A}|Acc]; - _ -> Acc - end; - _ -> - Acc + case NodeTree:get_node(N) of + #pubsub_node{nodeid = {Host, _}} = Node -> [{Node, A}|Acc]; + _ -> Acc end end, [], States), {result, Reply}. @@ -608,15 +607,14 @@ get_entity_subscriptions(Host, Owner) -> ++ mnesia:match_object( #pubsub_state{stateid = {SubKey, '_'}, _ = '_'}) end, + NodeTree = case ets:lookup(gen_mod:get_module_proc(Host, pubsub_state), nodetree) of + [{nodetree, N}] -> N; + _ -> nodetree_default + end, Reply = lists:foldl(fun(#pubsub_state{stateid = {J, N}, subscription = S}, Acc) -> - case mnesia:index_read(pubsub_node, N, #pubsub_node.id) of - [#pubsub_node{nodeid = {H, _}} = Node] -> - case H of - Host -> [{Node, S, J}|Acc]; - _ -> Acc - end; - _ -> - Acc + case NodeTree:get_node(N) of + #pubsub_node{nodeid = {Host, _}} = Node -> [{Node, S, J}|Acc]; + _ -> Acc end end, [], States), {result, Reply}. diff --git a/src/mod_pubsub/node_pep.erl b/src/mod_pubsub/node_pep.erl index 01523a087..868370eb8 100644 --- a/src/mod_pubsub/node_pep.erl +++ b/src/mod_pubsub/node_pep.erl @@ -170,8 +170,21 @@ purge_node(NodeId, Owner) -> node_default:purge_node(NodeId, Owner). get_entity_affiliations(_Host, Owner) -> - OwnerKey = jlib:short_prepd_bare_jid(Owner), - node_default:get_entity_affiliations(OwnerKey, Owner). + {_, D, _} = SubKey = jlib:jid_tolower(Owner), + SubKey = jlib:jid_tolower(Owner), + GenKey = jlib:jid_remove_resource(SubKey), + States = mnesia:match_object(#pubsub_state{stateid = {GenKey, '_'}, _ = '_'}), + NodeTree = case ets:lookup(gen_mod:get_module_proc(D, pubsub_state), nodetree) of + [{nodetree, N}] -> N; + _ -> nodetree_default + end, + Reply = lists:foldl(fun(#pubsub_state{stateid = {_, N}, affiliation = A}, Acc) -> + case NodeTree:get_node(N) of + #pubsub_node{nodeid = {{_, D, _}, _}} = Node -> [{Node, A}|Acc]; + _ -> Acc + end + end, [], States), + {result, Reply}. get_node_affiliations(NodeId) -> node_default:get_node_affiliations(NodeId). @@ -193,15 +206,14 @@ get_entity_subscriptions(_Host, Owner) -> ++ mnesia:match_object( #pubsub_state{stateid = {SubKey, '_'}, _ = '_'}) end, + NodeTree = case ets:lookup(gen_mod:get_module_proc(D, pubsub_state), nodetree) of + [{nodetree, N}] -> N; + _ -> nodetree_default + end, Reply = lists:foldl(fun(#pubsub_state{stateid = {J, N}, subscription = S}, Acc) -> - case mnesia:index_read(pubsub_node, N, #pubsub_node.id) of - [#pubsub_node{nodeid = {H, _}} = Node] -> - case H of - {_, D, _} -> [{Node, S, J}|Acc]; - _ -> Acc - end; - _ -> - Acc + case NodeTree:get_node(N) of + #pubsub_node{nodeid = {{_, D, _}, _}} = Node -> [{Node, S, J}|Acc]; + _ -> Acc end end, [], States), {result, Reply}. diff --git a/src/mod_pubsub/nodetree_default.erl b/src/mod_pubsub/nodetree_default.erl index dd5b3391f..eb5759f9a 100644 --- a/src/mod_pubsub/nodetree_default.erl +++ b/src/mod_pubsub/nodetree_default.erl @@ -48,6 +48,7 @@ set_node/1, get_node/3, get_node/2, + get_node/1, get_nodes/2, get_nodes/1, get_subnodes/3, @@ -110,6 +111,12 @@ get_node(Host, Node) -> [] -> {error, 'item-not-found'}; Error -> Error end. +get_node(NodeId) -> + case catch mnesia:index_read(pubsub_node, NodeId, #pubsub_node.id) of + [Record] when is_record(Record, pubsub_node) -> Record; + [] -> {error, 'item-not-found'}; + Error -> Error + end. %% @spec (Host) -> [pubsubNode()] | {error, Reason} %% Host = mod_pubsub:host() | mod_pubsub:jid() diff --git a/src/mod_pubsub/nodetree_virtual.erl b/src/mod_pubsub/nodetree_virtual.erl index 1083e5581..fd6887431 100644 --- a/src/mod_pubsub/nodetree_virtual.erl +++ b/src/mod_pubsub/nodetree_virtual.erl @@ -45,6 +45,7 @@ set_node/1, get_node/3, get_node/2, + get_node/1, get_nodes/2, get_nodes/1, get_subnodes/3, @@ -91,7 +92,9 @@ set_node(_NodeRecord) -> get_node(Host, Node, _From) -> get_node(Host, Node). get_node(Host, Node) -> - #pubsub_node{nodeid = {Host, Node}}. + #pubsub_node{nodeid = {Host, Node}, id = {Host, Node}}. +get_node(NodeId) -> + #pubsub_node{nodeid = NodeId, id = NodeId}. %% @spec (Host) -> [pubsubNode()] %% Host = mod_pubsub:host() | mod_pubsub:jid()