blob: 6add8d609769834a85fee6e9cfb06e214e0d7207 [file] [log] [blame]
% Licensed under the Apache License, Version 2.0 (the "License"); you may not
% use this file except in compliance with the License. You may obtain a copy of
% the License at
%
% http://www.apache.org/licenses/LICENSE-2.0
%
% Unless required by applicable law or agreed to in writing, software
% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
% License for the specific language governing permissions and limitations under
% the License.
-module(config_notifier).
-behaviour(gen_event).
-vsn(1).
%% Public interface
-export([subscribe/1]).
-export([subscribe/2]).
%% gen_event interface
-export([
init/1,
handle_event/2,
handle_call/2,
handle_info/2,
terminate/2,
code_change/3
]).
subscribe(Subscription) ->
subscribe(self(), Subscription).
subscribe(Subscriber, Subscription) ->
case lists:member(Subscriber, handlers()) of
true ->
ok;
false ->
gen_event:add_sup_handler(
config_event, {?MODULE, Subscriber}, {Subscriber, Subscription})
end.
init({Subscriber, Subscription}) ->
{ok, {Subscriber, Subscription}}.
handle_event({config_change, _, _, _, _} = Event, {Subscriber, Subscription}) ->
maybe_notify(Event, Subscriber, Subscription),
{ok, {Subscriber, Subscription}}.
handle_call(_Request, St) ->
{ok, ignored, St}.
handle_info(_Info, St) ->
{ok, St}.
terminate(_Reason, {_Subscriber, _Subscription}) ->
ok.
code_change(_OldVsn, St, _Extra) ->
{ok, St}.
maybe_notify(Event, Subscriber, all) ->
Subscriber ! Event;
maybe_notify({config_change, Sec, Key, _, _} = Event, Subscriber, Subscription) ->
case should_notify(Sec, Key, Subscription) of
true ->
Subscriber ! Event;
false ->
ok
end.
should_notify(Sec, Key, Subscription) ->
lists:any(fun(S) -> S =:= Sec orelse S =:= {Sec, Key} end, Subscription).
handlers() ->
AllHandlers = gen_event:which_handlers(config_event),
[Id || {?MODULE, Id} <- AllHandlers].