diff options
author | Tony Garnock-Jones <tonyg@lshift.net> | 2009-12-09 18:06:31 +0000 |
---|---|---|
committer | Tony Garnock-Jones <tonyg@lshift.net> | 2009-12-09 18:06:31 +0000 |
commit | 096fe58d592d37978f3d3d45560b729352f012e0 (patch) | |
tree | 0d4d88f1da0eb036c9dcf855926b742558e1e3b5 | |
parent | 4dfff17167efdd48e00f41d846fe6e53ef2a283f (diff) | |
download | rabbitmq-server-096fe58d592d37978f3d3d45560b729352f012e0.tar.gz |
No longer rely on magic module naming; use an explicit registry
-rw-r--r-- | src/rabbit_exchange.erl | 32 | ||||
-rw-r--r-- | src/rabbit_sup.erl | 2 |
2 files changed, 27 insertions, 7 deletions
diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl index 09ea1e96..d2932d61 100644 --- a/src/rabbit_exchange.erl +++ b/src/rabbit_exchange.erl @@ -33,6 +33,7 @@ -include("rabbit.hrl"). -include("rabbit_framing.hrl"). +-export([create_type_registry/0, register_type/2]). -export([recover/0, declare/5, lookup/1, lookup_or_die/1, list/1, info/1, info/2, info_all/1, info_all/2, publish/2]). @@ -94,6 +95,23 @@ -define(INFO_KEYS, [name, type, durable, auto_delete, arguments]. +create_type_registry() -> + rabbit_exchange_type_modules = + ets:new(rabbit_exchange_type_modules, [public, set, named_table]), + rabbit_exchange_type_names = + ets:new(rabbit_exchange_type_names, [public, set, named_table]), + ok = register_type(<<"direct">>, rabbit_exchange_type_direct), + ok = register_type(<<"fanout">>, rabbit_exchange_type_fanout), + ok = register_type(<<"headers">>, rabbit_exchange_type_headers), + ok = register_type(<<"topic">>, rabbit_exchange_type_topic), + ok. + +register_type(TypeName, ModuleName) + when is_binary(TypeName), is_atom(ModuleName) -> + true = ets:insert(rabbit_exchange_type_modules, {TypeName, ModuleName}), + true = ets:insert(rabbit_exchange_type_names, {ModuleName, TypeName}), + ok. + recover() -> ok = rabbit_misc:table_foreach( fun(Exchange) -> ok = mnesia:write(rabbit_exchange, @@ -135,17 +153,17 @@ declare(ExchangeName, Type, Durable, AutoDelete, Args) -> end). typename_to_plugin_module(T) when is_binary(T) -> - case catch list_to_existing_atom("rabbit_exchange_type_" ++ binary_to_list(T)) of - {'EXIT', {badarg, _}} -> + case ets:lookup(rabbit_exchange_type_modules, T) of + [{_, Module}] -> + Module; + [] -> rabbit_misc:protocol_error( - command_invalid, "invalid exchange type '~s'", [T]); - Module -> - Module + command_invalid, "invalid exchange type '~s'", [T]) end. plugin_module_to_typename(M) when is_atom(M) -> - "rabbit_exchange_type_" ++ S = atom_to_list(M), - list_to_binary(S). + [{_, TypeName}] = ets:lookup(rabbit_exchange_type_names, M), + TypeName. check_type(T) -> Module = typename_to_plugin_module(T), diff --git a/src/rabbit_sup.erl b/src/rabbit_sup.erl index 730d7909..dbbe1d64 100644 --- a/src/rabbit_sup.erl +++ b/src/rabbit_sup.erl @@ -43,4 +43,6 @@ start_link() -> supervisor:start_link({local, ?SERVER}, ?MODULE, []). init([]) -> + ok = rabbit_exchange:create_type_registry(), + {ok, {{one_for_one, 10, 10}, []}}. |