Current section

Files

Jump to
bpe src ext bpe_xml.erl
Raw

src/ext/bpe_xml.erl

-module(bpe_xml).
-include_lib("bpe/include/bpe.hrl").
-include_lib("xmerl/include/xmerl.hrl").
-compile(export_all).
attr(E) -> [ {N,V} || #xmlAttribute{name=N,value=V} <- E].
find(E,[]) -> [ {X,find(Sub,[]),attr(A)} || #xmlElement{name=X,attributes=A,content=Sub} <- E];
find(E, I) -> [ {X,find(Sub,[]),attr(A)} || #xmlElement{name=X,attributes=A,content=Sub} <- E, X == I].
load() ->
{ok,Bin} = file:read_file("priv/diagram_1.bpmn"),
Y = {#xmlElement{name=N,content=C}=X,_} = xmerl_scan:string(binary_to_list(Bin)),
E = {'bpmn:definitions',[{'bpmn:process',Elements,Attrs}],_} = {N,find(C,'bpmn:process'),attr(C)},
io:format("DEBUG: ~p~n",[E]),
Proc = reduce(Elements,#process{}).
reduce([],Acc) ->
Acc;
reduce([{'bpmn:task',Body,Attrs}|T],#process{tasks=Tasks} = Process) ->
Name = proplists:get_value(id,Attrs),
reduce(T,Process#process{tasks=[#task{name=Name}|Tasks]});
reduce([{'bpmn:startEvent',Body,Attrs}|T],#process{tasks=Tasks} = Process) ->
Name = proplists:get_value(id,Attrs),
reduce(T,Process#process{tasks=[#beginEvent{name=Name}|Tasks],beginEvent=Name});
reduce([{'bpmn:endEvent',Body,Attrs}|T],#process{tasks=Tasks} = Process) ->
Name = proplists:get_value(id,Attrs),
reduce(T,Process#process{tasks=[#endEvent{name=Name}|Tasks],endEvent=Name});
reduce([{'bpmn:sequenceFlow',Body,Attrs}|T],#process{flows=Flows} = Process) ->
Name = proplists:get_value(id,Attrs),
Source = proplists:get_value(sourceRef,Attrs),
Target = proplists:get_value(targetRef,Attrs),
reduce(T,Process#process{flows=[#sequenceFlow{name=Name,source=Source,target=Target}|Flows]});
reduce([{'bpmn:parallelGateway',Body,Attrs}|T],#process{tasks=Tasks} = Process) ->
Name = proplists:get_value(id,Attrs),
reduce(T,Process#process{tasks=[#gateway{name=Name,type=parallel}|Tasks]});
reduce([{'bpmn:exclusiveGateway',Body,Attrs}|T],#process{tasks=Tasks} = Process) ->
Name = proplists:get_value(id,Attrs),
reduce(T,Process#process{tasks=[#gateway{name=Name,type=exclusive}|Tasks]});
reduce([{'bpmn:inclusiveGateway',Body,Attrs}|T],#process{tasks=Tasks} = Process) ->
Name = proplists:get_value(id,Attrs),
reduce(T,Process#process{tasks=[#gateway{name=Name,type=inclusive}|Tasks]});
reduce([{'bpmn:complexGateway',Body,Attrs}|T],#process{tasks=Tasks} = Process) ->
Name = proplists:get_value(id,Attrs),
reduce(T,Process#process{tasks=[#gateway{name=Name,type=complex}|Tasks]});
reduce([{'bpmn:gateway',Body,Attrs}|T],#process{tasks=Tasks} = Process) ->
Name = proplists:get_value(id,Attrs),
reduce(T,Process#process{tasks=[#gateway{name=Name,type=none}|Tasks]}).