[thrift] gut Erlang Thrift configuration; start using get_env

Summary: I patterned some config stuff after iserve, but Erlang's built-in stuff is better

Reviewed By: gopher

Test Plan: works with recent ch server

Revert Plan: ok

Other Notes: default config given in thrift.app


git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@665307 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/erl/include/thrift.hrl b/lib/erl/include/thrift.hrl
index efd2b43..395d45e 100644
--- a/lib/erl/include/thrift.hrl
+++ b/lib/erl/include/thrift.hrl
@@ -4,8 +4,6 @@
 %%% See accompanying file LICENSE or visit the Thrift site at:
 %%% http://developers.facebook.com/thrift/
 
--define(CONFIG_FILE, filename:join("conf", "thrift.conf")).
-
 -define(ERROR(F, D),
 	error_logger:format(F, D)).
 
diff --git a/lib/erl/include/thrift.hrl.orig b/lib/erl/include/thrift.hrl.orig
deleted file mode 100644
index 53128ce..0000000
--- a/lib/erl/include/thrift.hrl.orig
+++ /dev/null
@@ -1,19 +0,0 @@
-%%% Copyright (c) 2007- Facebook
-%%% Distributed under the Thrift Software License
-%%% 
-%%% See accompanying file LICENSE or visit the Thrift site at:
-%%% http://developers.facebook.com/thrift/
-
--define(APPLICATION, thrift).
-
--define(CONFIG_FILE, filename:join(code:priv_dir(?APPLICATION), 
-				   atom_to_list(?APPLICATION) ++ ".conf")).
-
--define(ERROR(F, D),
-	error_logger:format(F, D)).
-
--define(INFO(Type, Report),
-	error_logger:info_report({thrift_info, Type}, Report)).
-
--include("thrift_macros.hrl").
--include("thrift_constants.hrl").
diff --git a/lib/erl/priv/thrift.conf b/lib/erl/priv/thrift.conf
deleted file mode 100644
index b32d21d..0000000
--- a/lib/erl/priv/thrift.conf
+++ /dev/null
@@ -1,7 +0,0 @@
-{thrift_logger, {
-  {term_width, 110},
-  {force_one_line, true},
-  {omit, [oop_new]},             % req_processed
-  {gen_server_messages, false}, 
-  {lookup, true}                 % DNS
- }}.
diff --git a/lib/erl/src/thrift.app.src b/lib/erl/src/thrift.app.src
index 590e6a9..e1d6be1 100644
--- a/lib/erl/src/thrift.app.src
+++ b/lib/erl/src/thrift.app.src
@@ -32,10 +32,15 @@
 
   % configuration parameters similar to those in the config file specified
   % on the command line. can be fetched with gas:get_env
-  {env, []},
+  {env, [
+    {term_width, 110},
+    {force_one_line, false},
+    {omit_fmt, ["thrift ~p:new(~s) = ~s"]},
+    {gen_server_messages, true},
+    {lookup, false}                 % DNS
+  ]},
 
   % The Module and Args used to start this application.
   {mod, {thrift_app, []}}
  ]
 }.
-
diff --git a/lib/erl/src/thrift.erl b/lib/erl/src/thrift.erl
index 5dc8987..ef2c1fa 100644
--- a/lib/erl/src/thrift.erl
+++ b/lib/erl/src/thrift.erl
@@ -6,7 +6,7 @@
 
 -module(thrift).
 
--export([start/0, stop/0, config/1, config/2]).
+-export([start/0, stop/0, config/1, config/2, reconfig/1]).
 
 -include("thrift.hrl").
 
@@ -24,46 +24,42 @@
 %%% configuration
 %%%
 
-%% go to the global file by default
-config(Path) ->
-    config(Path, {file, ?CONFIG_FILE}).
+config(Item) ->
+    config(?MODULE, Item).
 
-config(Path, Source) ->
-    case config1(Path, Source) of
-	{error, file_error, R} ->
-	    ?ERROR("error opening config ~p: ~p", [Source, R]),
-	    false;
-	{error, bad_item, Tuple} ->
-	    ?ERROR("malformed config item ~p found at ~p in ~p", [Tuple, Path, Source]),
-	    false;
-	{error, not_found} ->
-	    ?ERROR("config item ~p not found in ~p", [Path, Source]),
-	    false;
-	{value, V} ->
-	    {value, V}
+config(App, Item) ->
+    case application:get_env(App, Item) of
+        {ok, Value} ->
+            Value;
+        undefined ->
+            ?ERROR("configuration for ~p is unavailable", [Item]),
+            unconfigured_item,
+            exit({missing_config, App, Item})
     end.
 
-%% go to a file
-config1(Path, {file, File}) ->
-    case file:consult(File) of
+reconfig(Config) ->
+    BFName = filename:basename(Config, ".config"),
+    FName  = filename:join(filename:dirname(Config),
+                           BFName ++ ".config"),
+
+    case file:consult(FName) of
 	{error, R={_,_,_}} ->
 	    {error, file_error, file:format_error(R)};
 	{error, Posix} ->
 	    {error, file_error, Posix};
-	{ok, List} when is_list(List) ->
-	    config1(Path, List)
-    end;
+	{ok, [List]} when is_list(List) ->
+            reconfig1(List)
+    end.
 
-%% go through a list from a file or a sublist
-config1([P|Ps], List) when is_list(List) ->
-    case lists:keysearch(P, 1, List) of
-	{value, Tuple} when size(Tuple) == 2 ->
-	    List1 = element(2, Tuple), %% either another list or, if Ps is [], the item itself
-	    config1(Ps, List1);
-	{value, Tuple} ->
-	    {error, bad_item, Tuple};
-	false ->
-	    {error, not_found}
-    end;
-config1([], Item)     -> {value, Item};
-config1(Item, Source) -> config1([Item], Source).
+reconfig1([]) ->
+    ok;
+reconfig1([{App, List}|Tl]) ->
+    reconfig2(List, App, 0),
+    reconfig1(Tl).
+
+reconfig2([], App, Count) ->
+    ?INFO("application ~p reconfigured: ~p keys updated", [App, Count]),
+    ok;
+reconfig2([{Par, Val}|Tl], App, Count) ->
+    application:set_env(App, Par, Val),
+    reconfig2(Tl, App, Count+1).
diff --git a/lib/erl/src/thrift_logger.erl b/lib/erl/src/thrift_logger.erl
index 8528da3..e266ef4 100644
--- a/lib/erl/src/thrift_logger.erl
+++ b/lib/erl/src/thrift_logger.erl
@@ -8,10 +8,6 @@
 
 -behaviour(gen_event).
 
--record(state, {config}).
-
--define(CONFIG(Item), config(Item, State)).
-
 %% TODO(cpiro): either
 %% make exceptions know whether they need to be displayed
 %% or not exit with tExecptions for non-errors
@@ -25,12 +21,12 @@
 -export([init/1, handle_event/2, handle_call/2, 
          handle_info/2, terminate/2, code_change/3]).
 
--export([install/0, install/1, reconfig/0, reconfig/1]).
+-export([install/0]).
+
+-record(state, {}).
 
 %% ensure the regular logger is out and ours is in
 install() ->
-    install([]).
-install(Config) ->
     %% remove loggers
     io:format("starting logger~n"),
     lists:foreach(fun(Logger) ->
@@ -44,17 +40,8 @@
 
     gen_event:add_handler(error_logger, ?MODULE, []),
 
-    reconfig(Config),
-
     ok.
 
-%% load our config file and amend the given stuff
-reconfig() ->
-    reconfig([]).
-
-reconfig(Config) ->
-    gen_event:call(error_logger, ?MODULE, {reconfig, Config}).
-
 %%====================================================================
 %% gen_event callbacks
 %%====================================================================
@@ -67,17 +54,7 @@
 %% @end 
 %%--------------------------------------------------------------------
 init([]) ->
-    BootConfig = [
-      {term_width, 80},
-      {force_one_line, false},
-      {omit, []},
-      {omit_fmt, []},
-      {show_pid, false},
-      {gen_server_messages, true},
-      {lookup, false}
-    ], %% configuration before we try loading from file
-
-    State = #state{config=BootConfig},
+    State = #state{},
     {ok, State}.
 
 %%--------------------------------------------------------------------
@@ -101,7 +78,7 @@
 	end,
 
     Banner =
-        case ?CONFIG(show_pid) of
+        case config(show_pid) of
             true ->
                 sformat("~s ~s ~s", [Symbol, Pid, Type1]);
             false ->
@@ -114,7 +91,7 @@
     OutputSafe = sformat("~s", [MessageSafe]),
 
     Length =
-	case (length(OutputSafe) + BannerLen) < ?CONFIG(term_width) of
+	case (length(OutputSafe) + BannerLen) < config(term_width) of
 	    true  -> short;
 	    false -> long
 	end,
@@ -125,7 +102,7 @@
 	    false -> multiline
 	end,
 
-    case { ?CONFIG(force_one_line), Length, OneLine } of
+    case { config(force_one_line), Length, OneLine } of
 	%% one line and short ... print as is
 	{_, short, oneliner} ->
 	    format("~s~s~n", [Banner, OutputSafe]);
@@ -133,7 +110,7 @@
 	%% too long ... squash to one
 	{true, long, _} ->
 	    O = Banner ++ OutputSafe,
-	    Format = sformat("~~~ps >~n", [?CONFIG(term_width)-2]), % e.g. "~80s >~n"
+	    Format = sformat("~~~ps >~n", [config(term_width)-2]), % e.g. "~80s >~n"
 	    format(Format, [O]);
 
 	%% short but multiline... collapse to one
@@ -186,7 +163,7 @@
 	    Message = sformat("DATA DIDN'T MATCH: ~p~n", [Data]) ++ sformat(Format, Data),
 	    handle_event2(Symbol, Ref, "", Message, State);
 	{_, _} ->
-	    case lists:member(Format, ?CONFIG(omit_fmt)) of
+	    case lists:member(Format, config(omit_fmt)) of
 		false ->
 		    Message = sformat(Format, Data),
 		    handle_event2(Symbol, Ref, "", Message, State);
@@ -253,11 +230,6 @@
 %% handler to handle the request.
 %% @end 
 %%--------------------------------------------------------------------
-handle_call({reconfig, Amendments}, State) ->
-    {OkOrError, State1} = reconfig1(State, Amendments),
-    format(".. reconfig was ~p~n", [OkOrError]),
-    {ok, OkOrError, State1};
-    
 handle_call(_Request, State) ->
     Reply = ok,
     {ok, Reply, State}.
@@ -313,26 +285,8 @@
 sformat(Format, Data) ->
     thrift_utils:sformat(Format, Data).
 
-reconfig1(State, Amendments) ->
-    case thrift:config(thrift_logger) of
-	{value, Config} ->
-	    Config1     = lists:keysort(1, Config),
-	    Amendments1 = lists:keysort(1, Amendments),
-	    Config2     = lists:keymerge(1, Amendments1, Config1),
-
-	    State1 = State#state{config=Config2},
-	    {ok, State1};
-	_ -> 
-	    {error, State}
-    end.
-
-config(Item, State) ->
-    case thrift:config(Item, State#state.config) of
-	{value, V} ->
-	    V;
-	Else ->
-	    ?ERROR("config for ~p is unavailable: ~p", [Item, Else])
-    end.
+config(Item) ->
+    thrift:config(Item).
 
 do_print_crash_report(Report) ->
     case Report of