def apply
key = (attribute(:ref) || attribute_text).to_s
if name != 'ref'
key = name
tree[1]['ref'] = key
end
key = dsub(key)
key2, value = iterative_var_lookup(key)
tree[1]['ref'] = key2 if key2
tree[1]['original_ref'] = key if key2 != key
unless value
@h['participant'] =
@context.plist.lookup_info(tree[1]['ref'], h.applied_workitem)
value = key2 if ( ! @h['participant']) && (key2 != key)
end
new_exp_name, new_exp_class = nil
if
value.is_a?(String)
then
if
@context['participant_in_variable_enabled'] &&
value.match(/\bdef consume\(/) &&
(Rufus::TreeChecker.parse(value) rescue false)
then
@h['participant'] = [ 'Ruote::CodeParticipant', { 'code' => value } ]
tree[1]['ref'] = key
elsif klass = @context.expmap.expression_class(tree[1]['ref'])
new_exp_name = value
new_exp_class = klass
end
elsif
@context['participant_in_variable_enabled'] &&
value.is_a?(Hash) &&
value['on_workitem']
then
@h['participant'] = [ 'Ruote::BlockParticipant', value ]
elsif
value.is_a?(Array) &&
value.size == 2 && value.last.is_a?(Hash)
then
@h['participant'] = value
end
if value == nil && @h['participant'] == nil
@h['state'] = 'failed'
persist_or_raise
raise("unknown participant or subprocess '#{tree[1]['ref']}'")
end
new_exp_name, new_exp_class = if new_exp_name
[ new_exp_name, new_exp_class ]
elsif @h['participant']
[ 'participant', Ruote::Exp::ParticipantExpression ]
else
[ 'subprocess', Ruote::Exp::SubprocessExpression ]
end
tree[0] = new_exp_name
@h['name'] = new_exp_name
new_exp = new_exp_class.new(@context, @h)
new_exp.apply
end