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