Current section

Files

Jump to
bpe src bpe_task.erl
Raw

src/bpe_task.erl

-module(bpe_task).
-author('Maxim Sokhatsky').
-export([find_flow/1,
find_flow/2,
move_doclink/2,
targets/2,
denied_flow/2,
already_finished/1,
task_action/4,
handle_task/4]).
-include("bpe.hrl").
find_flow(noflow) -> [];
find_flow([H | _] = _List) when is_list(H) -> H;
find_flow([H | _] = List) when is_integer(H) -> List.
find_flow([], List) -> find_flow(List);
find_flow(Stage, List) ->
case lists:member(Stage, List) of
true -> Stage;
_ -> find_flow(List)
end.
move_doclink({_Source, _Target}, _Proc) -> [].
targets(Name, Proc) ->
lists:flatten([Target
|| #sequenceFlow{source = Source, target = Target}
<- Proc#process.flows,
Source == Name]).
denied_flow(Curr, Proc) ->
{reply, {denied_flow, Curr}, Proc}.
already_finished(Proc) -> {stop, {normal, []}, Proc}.
task_action(Module, Source, Target, Proc) ->
{M, F, A} = proplists:get_value(flow_callback,
Proc#process.etc,
{bpe_task, move_doclink, [{Source, Target}, Proc]}),
case Module:action({request, Source, Target}, Proc) of
#result{continue=C} = X when C =/= [] ->
X#result{opt={continue, C}};
#result{type=reply, reply=[]} = X ->
apply(M, F, A),
X#result{reply={complete, Target}};
#result{type=reply} = X ->
apply(M, F, A),
X;
X -> X
end.
handle_task(#beginEvent{}, CurrentTask, Target, Proc) ->
task_action(Proc#process.module,
CurrentTask,
Target,
Proc);
handle_task(#userTask{}, CurrentTask, Target,
Proc = #process{module = Module}) ->
task_action(Module, CurrentTask, Target, Proc);
handle_task(#receiveTask{reader = _Reader}, CurrentTask,
Target, #process{module = Module} = Proc) ->
task_action(Module, CurrentTask, Target, Proc);
handle_task(#sendTask{writer = _Writer}, CurrentTask,
Target, #process{module = Module} = Proc) ->
task_action(Module, CurrentTask, Target, Proc);
handle_task(#serviceTask{}, CurrentTask, Target,
#process{module = Module} = Proc) ->
task_action(Module, CurrentTask, Target, Proc);
handle_task(#gateway{type = parallel}, Src, Dst,
#process{module = Module} = Proc) ->
task_action(Module, Src, Dst, Proc);
handle_task(#endEvent{}, CurrentTask, Target,
#process{module = Module} = Proc) ->
task_action(Module, CurrentTask, Target, Proc),
{stop, {normal, Target}, Proc};
handle_task(_, _, Target, Proc) ->
{reply, {unknown_task, Target}, Proc}.