lib/openwfe/util/dollar.rb in ruote-0.9.18 vs lib/openwfe/util/dollar.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. #++ # # @@ -36,182 +36,168 @@ # # John Mettraux at openwfe.org # require 'rufus/dollar' # gem 'rufus-dollar' -require 'rufus/eval' # gem 'rufus-eval' require 'openwfe/utils' +require 'openwfe/util/treechecker' -# -# 'dollar notation' implementation in Ruby -# module OpenWFE - DSUB_SAFETY_LEVEL = 4 - # - # Ruby code ${ruby:...} will be evaluated with this - # safety level. - # (see http://www.rubycentral.com/book/taint.html ) + # + # Performs 'dollar substitution' on a piece of text with as input + # a flow expression and a workitem (fields and variables). + # + def OpenWFE.dosub (text, flow_expression, workitem) - # - # Performs 'dollar substitution' on a piece of text with as input - # a flow expression and a workitem (fields and variables). - # - def OpenWFE.dosub (text, flow_expression, workitem) + # + # patch by Nick Petrella (2008/03/20) + # - # - # patch by Nick Petrella (2008/03/20) - # + if text.is_a?(String) - if text.is_a?(String) + Rufus::dsub(text, FlowDict.new(flow_expression, workitem)) - Rufus::dsub(text, FlowDict.new(flow_expression, workitem)) + elsif text.is_a?(Array) - elsif text.is_a?(Array) + text.collect { |e| dosub(e, flow_expression, workitem) } - text.collect { |e| dosub(e, flow_expression, workitem) } + elsif text.is_a?(Hash) - elsif text.is_a?(Hash) + text.inject({}) do |r, (k, v)| - text.inject({}) do |r, (k, v)| - - r[dosub(k, flow_expression, workitem)] = - dosub(v, flow_expression, workitem) - r - end - - else - - text - end + r[dosub(k, flow_expression, workitem)] = + dosub(v, flow_expression, workitem) + r end - # - # Wrapping a process expression and the current workitem as a - # Hash object ready for lookup at substitution time. - # - class FlowDict + else - def initialize (flow_expression, workitem, default_prefix='v') + text + end + end - @flow_expression = flow_expression - @workitem = workitem - @default_prefix = default_prefix - end + # + # Wrapping a process expression and the current workitem as a + # Hash object ready for lookup at substitution time. + # + class FlowDict - def [] (key) + def initialize (flow_expression, workitem, default_prefix='v') - pr, k = extract_prefix key + @flow_expression = flow_expression + @workitem = workitem + @default_prefix = default_prefix + end - # stage 0 + def [] (key) - v = lookup(pr[0, 1], k) - return v if v != nil + pr, k = extract_prefix key - # stage 1 + # stage 0 - return "" if pr.size < 2 + v = lookup(pr[0, 1], k) + return v if v != nil - lookup(pr[1, 1], k) - end + # stage 1 - def []= (key, value) + return '' if pr.size < 2 - pr, k = extract_prefix key - pr = pr[0, 1] + lookup(pr[1, 1], k) + end - if pr == 'f' + def []= (key, value) - @workitem.set_attribute k, value + pr, k = extract_prefix key + pr = pr[0, 1] - elsif @flow_expression + if pr == 'f' - @flow_expression.set_variable k, value - end - end + @workitem.set_attribute k, value - def has_key? (key) + elsif @flow_expression - pr, k = extract_prefix key + @flow_expression.set_variable k, value + end + end - return true if pr == 'r' + def has_key? (key) - (self[key] != nil) - end + pr, k = extract_prefix key - protected + return true if pr == 'r' - def lookup (pr, key) + (self[key] != nil) + end - case pr - when 'v' then @flow_expression.lookup_variable(key) - when 'f' then @workitem.lookup_attribute(key) - when 'r' then call_ruby(key) - else nil - end - end + protected - def extract_prefix (key) + def lookup (pr, key) - i = key.index(':') + case pr + when 'v' then @flow_expression.lookup_variable(key) + when 'f' then @workitem.lookup_attribute(key) + when 'r' then call_ruby(key) + else nil + end + end - return [ @default_prefix, key ] if not i + def extract_prefix (key) - pr = key[0..i-1] # until ':' - pr = pr[0, 2] # the first two chars + i = key.index(':') - pr = pr[0, 1] unless (pr == 'vf') or (pr == 'fv') + return [ @default_prefix, key ] if not i - [ pr, key[i+1..-1] ] - end + pr = key[0..i-1] # until ':' + pr = pr[0, 2] # the first two chars - #-- - #def call_function (function_name) - # #"function '#{function_name}' is not implemented" - # "functions are not yet implemented" - # # - # # no need for them... we have Ruby :) - #end - #++ + pr = pr[0, 1] unless (pr == 'vf') or (pr == 'fv') - # - # The ${r:1+2} stuff. ("3"). - # - def call_ruby (ruby_code) + [ pr, key[i+1..-1] ] + end - if @flow_expression - return "" \ - if @flow_expression.ac[:ruby_eval_allowed] != true - end + #-- + #def call_function (function_name) + # #"function '#{function_name}' is not implemented" + # "functions are not yet implemented" + # # + # # no need for them... we have Ruby :) + #end + #++ - #binding = nil - #binding = @flow_expression.get_binding if @flow_expression - #eval(ruby_code, binding).to_s + # + # The ${r:1+2} stuff. ("3"). + # + def call_ruby (ruby_code) - wi = @workitem - workitem = @workitem + #if @flow_expression and @flow_expression.ac[:ruby_eval_allowed] != true + # return '' + #end + return '' if @flow_expression.ac[:ruby_eval_allowed] != true - fexp = nil - flow_expression = nil - fei = nil + wi = @workitem + workitem = @workitem - if @flow_expression - fexp = @flow_expression - flow_expression = @flow_expression - fei = @flow_expression.fei - end - # - # some simple notations made available to ${ruby:...} - # notations + #fexp = nil + #flow_expression = nil + #fei = nil - #eval(ruby_code, binding).to_s - #eval(ruby_code).to_s + #if @flow_expression + fexp = @flow_expression + flow_expression = @flow_expression + fei = @flow_expression.fei + #end + # + # some simple notations made available to ${ruby:...} + # notations - Rufus::eval_safely( - ruby_code, DSUB_SAFETY_LEVEL, binding()).to_s - end + #TreeChecker.check ruby_code + fexp.ac[:s_tree_checker].check(ruby_code) + + eval(ruby_code, binding()).to_s end + end end