Class OpenWFE::SubProcessRefExpression
In: lib/openwfe/expressions/fe_subprocess.rb
Parent: FlowExpression

This expression is used to launch/call a subprocess.

For example :

    <process-definition name="subtest0" revision="0">
        <sequence>
            <subprocess ref="sub0" a="A" b="B" c="C" />
            <sub0 a="A" b="B" c="C" />
        </sequence>

        <process-definition name="sub0">
            <print>${a}${b}${c}</print>
        </process-definition>

    </process-definition>

It‘s totally OK to have URLs as referenced processes :

    require 'openwfe/def'

    class AnotherDefinition0 < OpenWFE::ProcessDefinition
        def make
            sequence do
                participant ref => "toto"
                subprocess ref => "http://company.process.server/def0.rb"
            end
        end
    end

The ‘subprocess’ expression accepts a ‘forget’ attribute :

    class AnotherDefinition1 < OpenWFE::ProcessDefinition
        sequence do
            subprocess :ref => "my_subprocess", :forget => true
            participant :ref => "ringo"
        end
        process-definition :name => "my_subprocess" do
            participant :ref => "fake steve jobs"
        end
    end

The ‘subprocess’ expression accepts an ‘if’ (or ‘unless’) attribute :

    subprocess :ref => "interview_process", :if => "${f:screened}"
        # will trigger the subprocess only if the field screened
        # contains the string 'true' or the boolean 'true'

    interview_process :if => "${f:screened}"
        # idem

    interview_process :unless => "${f:has_had_problem_with_justice_?}"
        # well...

Methods

apply   cancel  

Included Modules

ConditionMixin

Attributes

subprocess_fei  [RW] 

Public Instance methods

[Source]

     # File lib/openwfe/expressions/fe_subprocess.rb, line 107
107:         def apply (workitem)
108: 
109:             conditional = eval_condition(:if, workitem, :unless)
110: 
111:             return reply_to_parent(workitem) \
112:                 if conditional == false
113: 
114:             ref = lookup_ref workitem
115: 
116:             raise "'subprocess' expression misses a 'ref', 'field-ref' or 'variable-ref' attribute" unless ref
117: 
118:             template_uri = OpenWFE::parse_known_uri ref 
119: 
120:             template = template_uri || lookup_variable(ref)
121: 
122:             raise "did not find any subprocess named '#{ref}'" \
123:                 if not template
124: 
125:             forget = lookup_boolean_attribute :forget, workitem
126: 
127:             requester = if forget
128:                 @fei.workflow_instance_id
129:             else
130:                 @fei
131:             end
132: 
133:             params = lookup_attributes workitem
134: 
135:             text = fetch_text_content workitem, false
136:             params["0"] = text if text
137: 
138:             #puts
139:             #puts " ... params are #{params.keys.join(', ')}"
140:             #puts " ... values are #{params.values.join(', ')}"
141: 
142:             sub_fei = get_expression_pool.launch_template(
143:                 requester, nil, get_next_sub_id, template, workitem, params)
144: 
145:             if forget
146:                 reply_to_parent workitem.dup
147:             else
148:                 @subprocess_fei = sub_fei.dup
149:                 store_itself # to keep track of @subprocess_fei
150:             end
151:         end

Takes care of cancelling the subprocess as well if any

[Source]

     # File lib/openwfe/expressions/fe_subprocess.rb, line 156
156:         def cancel
157: 
158:             return nil unless @subprocess_fei
159:             get_expression_pool.cancel @subprocess_fei
160:         end

[Validate]