lib/openwfe/expressions/fe_subprocess.rb in ruote-0.9.18 vs lib/openwfe/expressions/fe_subprocess.rb in ruote-0.9.19

- old
+ new

@@ -1,34 +1,34 @@ # #-- # Copyright (c) 2006-2008, John Mettraux, OpenWFE.org # All rights reserved. -# -# Redistribution and use in source and binary forms, with or without +# +# Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: -# +# # . Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# . Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation +# list of conditions and the following disclaimer. +# +# . Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. -# +# # . Neither the name of the "OpenWFE" nor the names of its contributors may be # used to endorse or promote products derived from this software without # specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. #++ # # @@ -40,129 +40,132 @@ require 'openwfe/utils' module OpenWFE - # - # 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 - # sequence do - # participant :ref => "toto" - # subprocess :ref => "http://company.process.server/def0.rb" - # end - # end - # - # (but the engine parameter :remove_definitions_allowed must be set to true, - # as it's dangerous to fetch process definitions from other [untrusted] - # hosts) - # - # 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... - # - class SubProcessRefExpression < FlowExpression - include ConditionMixin + # + # 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 + # sequence do + # participant :ref => "toto" + # subprocess :ref => "http://company.process.server/def0.rb" + # end + # end + # + # (but the engine parameter :remove_definitions_allowed must be set to true, + # as it's dangerous to fetch process definitions from other [untrusted] + # hosts) + # + # 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 + # + # Note that a 'forgotten subprocess' will not have access to the variables + # of its parent process. + # + # 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... + # + class SubProcessRefExpression < FlowExpression + include ConditionMixin - names :subprocess + names :subprocess - attr_accessor :subprocess_fei + attr_accessor :subprocess_fei - def apply (workitem) + def apply (workitem) - conditional = eval_condition(:if, workitem, :unless) + conditional = eval_condition(:if, workitem, :unless) - return reply_to_parent(workitem) \ - if conditional == false + return reply_to_parent(workitem) \ + if conditional == false - ref = lookup_ref workitem + ref = lookup_ref workitem - raise "'subprocess' expression misses a 'ref', 'field-ref' or 'variable-ref' attribute" unless ref + raise "'subprocess' expression misses a 'ref', 'field-ref' or 'variable-ref' attribute" unless ref - template_uri = OpenWFE::parse_known_uri ref + template_uri = OpenWFE::parse_known_uri ref - template = template_uri || lookup_variable(ref) + template = template_uri || lookup_variable(ref) - raise "did not find any subprocess named '#{ref}'" \ - if not template + raise "did not find any subprocess named '#{ref}'" \ + if not template - forget = lookup_boolean_attribute :forget, workitem + forget = lookup_boolean_attribute :forget, workitem - params = lookup_attributes workitem + params = lookup_attributes workitem - text = fetch_text_content workitem, false - params["0"] = text if text + text = fetch_text_content workitem, false + params["0"] = text if text - #puts - #puts " ... params are #{params.keys.join(', ')}" - #puts " ... values are #{params.values.join(', ')}" + #puts + #puts " ... params are #{params.keys.join(', ')}" + #puts " ... values are #{params.values.join(', ')}" - #requester = if forget - # @fei.workflow_instance_id - #else - # @fei - #end - #sub_fei = get_expression_pool.launch_template( - # requester, nil, get_next_sub_id, template, workitem, params) + #requester = if forget + # @fei.workflow_instance_id + #else + # @fei + #end + #sub_fei = get_expression_pool.launch_template( + # requester, nil, get_next_sub_id, template, workitem, params) - sub_fei = get_expression_pool.launch_subprocess( - self, template, forget, workitem, params) + sub_fei = get_expression_pool.launch_subprocess( + self, template, forget, workitem, params) - if forget - reply_to_parent workitem.dup - else - @subprocess_fei = sub_fei.dup - store_itself # to keep track of @subprocess_fei - end - end + if forget + reply_to_parent workitem.dup + else + @subprocess_fei = sub_fei.dup + store_itself # to keep track of @subprocess_fei + end + end - # - # Takes care of cancelling the subprocess as well if any - # - def cancel + # + # Takes care of cancelling the subprocess as well if any + # + def cancel - return nil unless @subprocess_fei - get_expression_pool.cancel @subprocess_fei - end + return nil unless @subprocess_fei + get_expression_pool.cancel @subprocess_fei end + end end