%% -*- mode: nitrogen -*-
%% vim: ts=4 sw=4 et
-module(webmachine_simple_bridge_sup).
-behaviour(supervisor).
-export([
start_link/0,
init/1
]).
%% Helper macro for declaring children of supervisor
-define(CHILD(I, Type), {I, {I, start_link, []}, permanent, 5000, Type, [I]}).
%% ===================================================================
%% API functions
%% ===================================================================
start_link() ->
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
%% ===================================================================
%% Supervisor callbacks
%% ===================================================================
init([]) ->
application:start(inets),
application:start(crypto),
application:load(webmachine),
{Address, Port} = simple_bridge_util:get_address_and_port(webmachine),
Dispatch = generate_dispatch(),
io:format("Starting Webmachine Server on ~p:~p~n", [Address, Port]),
Options = [
{ip, Address},
{port, Port},
{dispatch, Dispatch}
],
Web = {webmachine_mochiweb,
{webmachine_mochiweb, start, [Options]},
permanent, 5000, worker, [mochiweb_socket_server]},
Processes = [Web],
{ok, _} = application:ensure_all_started(webmachine),
{ok, { {one_for_one, 5, 10}, Processes} }.
generate_dispatch() ->
case application:get_env(simple_bridge, webmachine_dispatch) of
{ok, Dispatch} -> Dispatch;
undefined ->
case application:get_env(simple_bridge, webmachine_dispatch_fun) of
{ok, {M,F}} ->
M:F();
undefined ->
build_dispatch()
end
end.
build_dispatch() ->
{DocRoot, StaticPaths} = simple_bridge_util:get_docroot_and_static_paths(webmachine),
io:format("Static Paths: ~p~nDocument Root for Static: ~s~n",
[StaticPaths, DocRoot]),
build_dispatch(DocRoot, StaticPaths).
build_dispatch(DocRoot, StaticPaths) ->
Handler = simple_bridge_util:get_env(handler),
StaticDispatches = [make_static_dispatch(DocRoot, StaticPath) || StaticPath <- StaticPaths],
StaticDispatches ++ [
%% Static content handlers can be defined manually like so:
%% {["js", '*'], webmachine_simple_bridge_static, [{root, "./site/static/js"}]},
%% {["css", '*'], webmachine_simple_bridge_static, [{root, "./site/static/css"}]},
%% {["images", '*'], webmachine_simple_bridge_static, [{root, "./site/static/images"}]},
%%
%% But instead of doing it manually, we'll load it from the configuration
%% Add routes to your modules here. The last entry makes the
%% system use simple_bridge's handler, which is a generic handler for
%% all non-static requests, and uses the `handler` configuration
%% variable to call out to your application.
%%
%% p.s. - Remember that you will need to RESTART THE VM for
%% dispatch changes to take effect!!!
%%
%% {["path","to","module1",'*'], HandlerModule1, InitialState1}
%% {["path","to","module2",'*'], HandlerModule2, InitialState2}
%% {["path","to","module3",'*'], HandlerModule3, InitialState3}
{['*'], simple_bridge_util:get_anchor_module(webmachine), Handler}
].
join_path(Root,Path) when is_binary(Root) orelse is_binary(Path) ->
join_path(wf:to_list(Root),wf:to_list(Path));
join_path(Root,Path) ->
RootEndsWithSlash = lists:last(Root)==$/,
PathStartsWithSlash = hd(Path)==$/,
if
RootEndsWithSlash andalso PathStartsWithSlash ->
Root ++ tl(Path);
not(RootEndsWithSlash) andalso not(PathStartsWithSlash) ->
Root ++ "/" ++ Path;
true ->
%% Either the root ends with a slash, or the path starts with a
%% slash, but not both, so we can just concantenate them together
%% safely
Root ++ Path
end.
make_static_dispatch(DocRoot, StaticPath) ->
TokenStatic = string:tokens(StaticPath,"/"),
FormattedPath = TokenStatic ++ ['*'],
{FormattedPath, webmachine_simple_bridge_static, [{root, join_path(DocRoot,StaticPath)}]}.