ruote 0.9.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.txt +24 -0
- data/bin/validate-workflow.rb +89 -0
- data/examples/about_state.rb +81 -0
- data/examples/bigflow.rb +19 -0
- data/examples/csv_weather.rb +23 -0
- data/examples/engine_template.rb +247 -0
- data/examples/flowtracing.rb +24 -0
- data/examples/homeworkreview.rb +68 -0
- data/examples/kotoba.rb +22 -0
- data/examples/mano_tracker.rb +172 -0
- data/examples/openwferu.rb +58 -0
- data/examples/quotereporter.rb +157 -0
- data/examples/scheduler_cron_usage.rb +48 -0
- data/examples/scheduler_usage.rb +56 -0
- data/lib/openwfe.rb +41 -0
- data/lib/openwfe/contextual.rb +111 -0
- data/lib/openwfe/def.rb +46 -0
- data/lib/openwfe/engine.rb +37 -0
- data/lib/openwfe/engine/engine.rb +756 -0
- data/lib/openwfe/engine/expool_methods.rb +172 -0
- data/lib/openwfe/engine/file_persisted_engine.rb +105 -0
- data/lib/openwfe/engine/participant_methods.rb +133 -0
- data/lib/openwfe/engine/status_methods.rb +353 -0
- data/lib/openwfe/engine/update_exp_methods.rb +112 -0
- data/lib/openwfe/exceptions.rb +51 -0
- data/lib/openwfe/expool/errorjournal.rb +476 -0
- data/lib/openwfe/expool/expressionpool.rb +1144 -0
- data/lib/openwfe/expool/expstorage.rb +403 -0
- data/lib/openwfe/expool/history.rb +174 -0
- data/lib/openwfe/expool/journal.rb +224 -0
- data/lib/openwfe/expool/journal_replay.rb +321 -0
- data/lib/openwfe/expool/parser.rb +242 -0
- data/lib/openwfe/expool/representation.rb +121 -0
- data/lib/openwfe/expool/threadedexpstorage.rb +188 -0
- data/lib/openwfe/expool/wfidgen.rb +388 -0
- data/lib/openwfe/expool/yamlexpstorage.rb +224 -0
- data/lib/openwfe/expressions/condition.rb +244 -0
- data/lib/openwfe/expressions/environment.rb +246 -0
- data/lib/openwfe/expressions/expressionmap.rb +258 -0
- data/lib/openwfe/expressions/fe_cancel.rb +109 -0
- data/lib/openwfe/expressions/fe_command.rb +241 -0
- data/lib/openwfe/expressions/fe_concurrence.rb +662 -0
- data/lib/openwfe/expressions/fe_cron.rb +259 -0
- data/lib/openwfe/expressions/fe_cursor.rb +259 -0
- data/lib/openwfe/expressions/fe_define.rb +192 -0
- data/lib/openwfe/expressions/fe_do.rb +168 -0
- data/lib/openwfe/expressions/fe_equals.rb +291 -0
- data/lib/openwfe/expressions/fe_filter.rb +129 -0
- data/lib/openwfe/expressions/fe_filter_definition.rb +168 -0
- data/lib/openwfe/expressions/fe_fqv.rb +250 -0
- data/lib/openwfe/expressions/fe_if.rb +303 -0
- data/lib/openwfe/expressions/fe_iterator.rb +145 -0
- data/lib/openwfe/expressions/fe_listen.rb +371 -0
- data/lib/openwfe/expressions/fe_losfor.rb +111 -0
- data/lib/openwfe/expressions/fe_misc.rb +421 -0
- data/lib/openwfe/expressions/fe_participant.rb +269 -0
- data/lib/openwfe/expressions/fe_reserve.rb +212 -0
- data/lib/openwfe/expressions/fe_save.rb +274 -0
- data/lib/openwfe/expressions/fe_sequence.rb +117 -0
- data/lib/openwfe/expressions/fe_set.rb +139 -0
- data/lib/openwfe/expressions/fe_sleep.rb +166 -0
- data/lib/openwfe/expressions/fe_step.rb +159 -0
- data/lib/openwfe/expressions/fe_subprocess.rb +168 -0
- data/lib/openwfe/expressions/fe_timeout.rb +127 -0
- data/lib/openwfe/expressions/fe_wait.rb +78 -0
- data/lib/openwfe/expressions/fe_when.rb +142 -0
- data/lib/openwfe/expressions/filter.rb +104 -0
- data/lib/openwfe/expressions/flowexpression.rb +847 -0
- data/lib/openwfe/expressions/iterator.rb +221 -0
- data/lib/openwfe/expressions/merge.rb +84 -0
- data/lib/openwfe/expressions/raw.rb +547 -0
- data/lib/openwfe/expressions/rprocdef.rb +375 -0
- data/lib/openwfe/expressions/time.rb +333 -0
- data/lib/openwfe/expressions/timeout.rb +178 -0
- data/lib/openwfe/expressions/value.rb +126 -0
- data/lib/openwfe/filterdef.rb +259 -0
- data/lib/openwfe/flowexpressionid.rb +357 -0
- data/lib/openwfe/listeners/listener.rb +97 -0
- data/lib/openwfe/listeners/listeners.rb +139 -0
- data/lib/openwfe/listeners/socketlisteners.rb +272 -0
- data/lib/openwfe/logging.rb +122 -0
- data/lib/openwfe/omixins.rb +95 -0
- data/lib/openwfe/orest/controlclient.rb +119 -0
- data/lib/openwfe/orest/definitions.rb +113 -0
- data/lib/openwfe/orest/exception.rb +60 -0
- data/lib/openwfe/orest/oldrestservlet.rb +279 -0
- data/lib/openwfe/orest/osocket.rb +148 -0
- data/lib/openwfe/orest/restclient.rb +176 -0
- data/lib/openwfe/orest/workitem.rb +206 -0
- data/lib/openwfe/orest/worklistclient.rb +272 -0
- data/lib/openwfe/orest/xmlcodec.rb +670 -0
- data/lib/openwfe/participants.rb +38 -0
- data/lib/openwfe/participants/enoparticipants.rb +230 -0
- data/lib/openwfe/participants/participant.rb +141 -0
- data/lib/openwfe/participants/participantmap.rb +249 -0
- data/lib/openwfe/participants/participants.rb +407 -0
- data/lib/openwfe/participants/soapparticipants.rb +135 -0
- data/lib/openwfe/participants/socketparticipants.rb +202 -0
- data/lib/openwfe/participants/storeparticipants.rb +254 -0
- data/lib/openwfe/rudefinitions.rb +130 -0
- data/lib/openwfe/service.rb +103 -0
- data/lib/openwfe/storage/yamlcustom.rb +106 -0
- data/lib/openwfe/storage/yamlfilestorage.rb +245 -0
- data/lib/openwfe/tools/flowtracer.rb +81 -0
- data/lib/openwfe/util/dollar.rb +217 -0
- data/lib/openwfe/util/irb.rb +86 -0
- data/lib/openwfe/util/observable.rb +144 -0
- data/lib/openwfe/util/ometa.rb +62 -0
- data/lib/openwfe/util/workqueue.rb +124 -0
- data/lib/openwfe/util/xml.rb +418 -0
- data/lib/openwfe/utils.rb +554 -0
- data/lib/openwfe/version.rb +37 -0
- data/lib/openwfe/workitem.rb +499 -0
- data/lib/openwfe/worklist/oldrest.rb +244 -0
- data/lib/openwfe/worklist/storelocks.rb +293 -0
- data/lib/openwfe/worklist/storeparticipant.rb +44 -0
- data/lib/openwfe/worklist/worklist.rb +297 -0
- data/test/README.txt +27 -0
- data/test/back_0916_test.rb +111 -0
- data/test/bm/bm_1_xml_vs_prog.rb +56 -0
- data/test/bm/bm_2_step.rb +109 -0
- data/test/bm/ft_0f_5ms.rb +35 -0
- data/test/bm/ft_26_load.rb +210 -0
- data/test/bm/ft_26b_load.rb +86 -0
- data/test/bm/ft_26c_load.rb +97 -0
- data/test/bm/ft_26d_load.rb +97 -0
- data/test/bm/ft_recu.rb +71 -0
- data/test/clone_test.rb +122 -0
- data/test/concurrence_test.rb +77 -0
- data/test/condition_test.rb +155 -0
- data/test/console_test.rb +12 -0
- data/test/cron_ltest.rb +15 -0
- data/test/description_test.rb +87 -0
- data/test/eno_test.rb +76 -0
- data/test/expmap_test.rb +54 -0
- data/test/expool_20031219_0916.tgz +0 -0
- data/test/fe_lookup_att_test.rb +62 -0
- data/test/fei_test.rb +181 -0
- data/test/file_persisted_engine_test.rb +64 -0
- data/test/file_persistence_test.rb +134 -0
- data/test/filep_cancel_test.rb +123 -0
- data/test/filter_test.rb +109 -0
- data/test/flowtestbase.rb +351 -0
- data/test/ft_0.rb +68 -0
- data/test/ft_0b_sequence.rb +36 -0
- data/test/ft_0c_testname.rb +33 -0
- data/test/ft_0d_participant.rb +30 -0
- data/test/ft_0e_multibody.rb +34 -0
- data/test/ft_10_loop.rb +134 -0
- data/test/ft_11_ppd.rb +415 -0
- data/test/ft_11b_ppd.rb +54 -0
- data/test/ft_12_blockparticipant.rb +97 -0
- data/test/ft_13_eno.rb +52 -0
- data/test/ft_14_subprocess.rb +88 -0
- data/test/ft_14b_subprocess.rb +192 -0
- data/test/ft_14c_subprocess.rb +68 -0
- data/test/ft_15_iterator.rb +216 -0
- data/test/ft_15b_iterator.rb +74 -0
- data/test/ft_16_fqv.rb +73 -0
- data/test/ft_17_condition.rb +84 -0
- data/test/ft_18_pname.rb +56 -0
- data/test/ft_1_unset.rb +175 -0
- data/test/ft_1b_unset.rb +39 -0
- data/test/ft_20_cron.rb +53 -0
- data/test/ft_21_cron.rb +87 -0
- data/test/ft_21b_cron_pause.rb +82 -0
- data/test/ft_22_history.rb +74 -0
- data/test/ft_23_when.rb +77 -0
- data/test/ft_23b_when.rb +70 -0
- data/test/ft_23c_wait.rb +80 -0
- data/test/ft_23d_cww.rb +58 -0
- data/test/ft_24_def.rb +44 -0
- data/test/ft_25_cancel.rb +89 -0
- data/test/ft_27_getflowpos.rb +147 -0
- data/test/ft_28_fileparticipant.rb +63 -0
- data/test/ft_29_httprb.rb +106 -0
- data/test/ft_2_concurrence.rb +135 -0
- data/test/ft_2b_concurrence.rb +188 -0
- data/test/ft_2c_concurrence.rb +64 -0
- data/test/ft_30_socketlistener.rb +203 -0
- data/test/ft_31_flowname.rb +40 -0
- data/test/ft_32_journal.rb +91 -0
- data/test/ft_32c_journal.rb +102 -0
- data/test/ft_32d_journal.rb +84 -0
- data/test/ft_33_description.rb +107 -0
- data/test/ft_34_cancelwfid.rb +80 -0
- data/test/ft_35_localdefs.rb +75 -0
- data/test/ft_36_subprocids.rb +97 -0
- data/test/ft_37_pnames.rb +70 -0
- data/test/ft_38_tag.rb +127 -0
- data/test/ft_38b_tag.rb +161 -0
- data/test/ft_38c_tag.rb +100 -0
- data/test/ft_39_reserve.rb +63 -0
- data/test/ft_39b_reserve.rb +84 -0
- data/test/ft_3_equals.rb +170 -0
- data/test/ft_3b_lookup_vf.rb +83 -0
- data/test/ft_40_defined.rb +61 -0
- data/test/ft_41_case.rb +110 -0
- data/test/ft_42_environments.rb +75 -0
- data/test/ft_43_pat10.rb +85 -0
- data/test/ft_44_save.rb +70 -0
- data/test/ft_44b_restore.rb +212 -0
- data/test/ft_45_citerator.rb +214 -0
- data/test/ft_46_pparams.rb +62 -0
- data/test/ft_47_filter.rb +160 -0
- data/test/ft_48_fe_filter.rb +88 -0
- data/test/ft_49_condition.rb +126 -0
- data/test/ft_4_misc.rb +237 -0
- data/test/ft_50_xml_attribute.rb +155 -0
- data/test/ft_51_stack.rb +55 -0
- data/test/ft_52_obs_participant.rb +123 -0
- data/test/ft_53_null_noop_participant.rb +62 -0
- data/test/ft_54_listen.rb +288 -0
- data/test/ft_54b_listen.rb +66 -0
- data/test/ft_54c_listen.rb +99 -0
- data/test/ft_55_ptimeout.rb +59 -0
- data/test/ft_56_timeout.rb +59 -0
- data/test/ft_57_a.rb +145 -0
- data/test/ft_58_ejournal.rb +151 -0
- data/test/ft_59_ps.rb +150 -0
- data/test/ft_59b_ps_for_pat.rb +58 -0
- data/test/ft_5_time.rb +118 -0
- data/test/ft_60_ecancel.rb +161 -0
- data/test/ft_61_elsub.rb +51 -0
- data/test/ft_62_procparticipant.rb +71 -0
- data/test/ft_63_pause.rb +124 -0
- data/test/ft_64_alias.rb +102 -0
- data/test/ft_64_clone.rb +69 -0
- data/test/ft_65_stringlaunch.rb +59 -0
- data/test/ft_66_subforget.rb +70 -0
- data/test/ft_67_schedlaunch.rb +116 -0
- data/test/ft_68_ifparticipant.rb +70 -0
- data/test/ft_69_cancelmissing.rb +51 -0
- data/test/ft_6_lambda.rb +64 -0
- data/test/ft_70_lookupvar.rb +55 -0
- data/test/ft_71_log.rb +60 -0
- data/test/ft_72_lookup_processes.rb +76 -0
- data/test/ft_73_cancel_sub.rb +139 -0
- data/test/ft_74_block_and_workitem_dup.rb +63 -0
- data/test/ft_75_ruby_attributes.rb +87 -0
- data/test/ft_76_merge_isolate.rb +88 -0
- data/test/ft_77_segments.rb +35 -0
- data/test/ft_78_eval.rb +150 -0
- data/test/ft_79_tticket.rb +187 -0
- data/test/ft_79b_tticket.rb +172 -0
- data/test/ft_79c_outcome.rb +56 -0
- data/test/ft_7_lose.rb +104 -0
- data/test/ft_7b_lose.rb +78 -0
- data/test/ft_80_spname.rb +91 -0
- data/test/ft_81_exp.rb +60 -0
- data/test/ft_82_trecu.rb +46 -0
- data/test/ft_83_badpause.rb +58 -0
- data/test/ft_84_updateexp.rb +198 -0
- data/test/ft_85_dolhash.rb +43 -0
- data/test/ft_86_dollar_fv.rb +68 -0
- data/test/ft_87_define.rb +74 -0
- data/test/ft_8_forget.rb +44 -0
- data/test/ft_9_cursor.rb +145 -0
- data/test/ft_9b_cursor.rb +105 -0
- data/test/ft_tests.rb +124 -0
- data/test/hash_test.rb +75 -0
- data/test/hparticipant_test.rb +164 -0
- data/test/lookup_att_test.rb +90 -0
- data/test/lookup_vf_test.rb +94 -0
- data/test/misc_test.rb +90 -0
- data/test/nut_0_irb.rb +20 -0
- data/test/obs_test.rb +142 -0
- data/test/orest_test.rb +251 -0
- data/test/param_test.rb +290 -0
- data/test/participant_test.rb +101 -0
- data/test/pending.rb +23 -0
- data/test/ps_representation.rb +133 -0
- data/test/rake_ltest.rb +38 -0
- data/test/rake_qtest.rb +68 -0
- data/test/raw_prog_test.rb +412 -0
- data/test/restart_cron_test.rb +136 -0
- data/test/restart_paused_test.rb +98 -0
- data/test/restart_sleep_test.rb +140 -0
- data/test/restart_tests.rb +18 -0
- data/test/restart_when_test.rb +112 -0
- data/test/ruby_procdef_test.rb +132 -0
- data/test/rutest_utils.rb +63 -0
- data/test/sec_test.rb +205 -0
- data/test/slock_test.rb +80 -0
- data/test/storage_test.rb +44 -0
- data/test/test.rb +3 -0
- data/test/timeout_test.rb +105 -0
- data/test/util_xml_test.rb +112 -0
- data/test/wfid_test.rb +175 -0
- data/test/wi_test.rb +75 -0
- metadata +433 -0
|
@@ -0,0 +1,554 @@
|
|
|
1
|
+
#
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 2005-2008, John Mettraux, OpenWFE.org
|
|
4
|
+
# All rights reserved.
|
|
5
|
+
#
|
|
6
|
+
# Redistribution and use in source and binary forms, with or without
|
|
7
|
+
# modification, are permitted provided that the following conditions are met:
|
|
8
|
+
#
|
|
9
|
+
# . Redistributions of source code must retain the above copyright notice, this
|
|
10
|
+
# list of conditions and the following disclaimer.
|
|
11
|
+
#
|
|
12
|
+
# . Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
# this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
# and/or other materials provided with the distribution.
|
|
15
|
+
#
|
|
16
|
+
# . Neither the name of the "OpenWFE" nor the names of its contributors may be
|
|
17
|
+
# used to endorse or promote products derived from this software without
|
|
18
|
+
# specific prior written permission.
|
|
19
|
+
#
|
|
20
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
21
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
22
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
23
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
24
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
25
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
26
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
27
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
28
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
29
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
30
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
|
31
|
+
#++
|
|
32
|
+
#
|
|
33
|
+
|
|
34
|
+
#
|
|
35
|
+
# "hecho en Costa Rica" and "made in Japan"
|
|
36
|
+
#
|
|
37
|
+
# john.mettraux@openwfe.org
|
|
38
|
+
#
|
|
39
|
+
|
|
40
|
+
require 'rexml/document'
|
|
41
|
+
require 'tmpdir'
|
|
42
|
+
require 'open-uri'
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
module OpenWFE
|
|
46
|
+
|
|
47
|
+
#
|
|
48
|
+
# see
|
|
49
|
+
# http://wiki.rubygarden.org/Ruby/page/show/Make_A_Deep_Copy_Of_An_Object
|
|
50
|
+
#
|
|
51
|
+
# It's not perfect (that's why fulldup() uses it only in certain cases).
|
|
52
|
+
#
|
|
53
|
+
# For example :
|
|
54
|
+
#
|
|
55
|
+
# TypeError: singleton can't be dumped
|
|
56
|
+
# ./lib/openwfe/utils.rb:74:in `dump'
|
|
57
|
+
# ./lib/openwfe/utils.rb:74:in `deep_clone'
|
|
58
|
+
#
|
|
59
|
+
def OpenWFE.deep_clone (object)
|
|
60
|
+
|
|
61
|
+
Marshal::load(Marshal.dump(object))
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
#
|
|
65
|
+
# an automatic dup implementation attempt
|
|
66
|
+
#
|
|
67
|
+
def OpenWFE.fulldup (object)
|
|
68
|
+
|
|
69
|
+
return nil if object == nil
|
|
70
|
+
|
|
71
|
+
return object.fulldup if object.respond_to?("fulldup")
|
|
72
|
+
# trusting client objects providing a fulldup() implementation
|
|
73
|
+
# Tomaso Tosolini 2007.12.11
|
|
74
|
+
|
|
75
|
+
return object if object.kind_of?(Float)
|
|
76
|
+
return object if object.kind_of?(Fixnum)
|
|
77
|
+
return object if object.kind_of?(TrueClass)
|
|
78
|
+
return object if object.kind_of?(FalseClass)
|
|
79
|
+
return object if object.kind_of?(Symbol)
|
|
80
|
+
|
|
81
|
+
return object.dup if object.kind_of?(String)
|
|
82
|
+
|
|
83
|
+
#return deep_clone(object) if object.kind_of?(REXML::Document)
|
|
84
|
+
|
|
85
|
+
#return REXML::Document.new(object.to_s) \
|
|
86
|
+
# if object.kind_of? REXML::Document
|
|
87
|
+
|
|
88
|
+
if object.kind_of?(REXML::Element)
|
|
89
|
+
d = REXML::Document.new object.to_s
|
|
90
|
+
return d if object.kind_of?(REXML::Document)
|
|
91
|
+
return d.root
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
return deep_clone(object) if object.is_a?(Date)
|
|
95
|
+
|
|
96
|
+
return Time.at(object) if object.is_a?(Time)
|
|
97
|
+
# patch by Maarten Oelering
|
|
98
|
+
|
|
99
|
+
return Rational(object.denominator, object.numerator) \
|
|
100
|
+
if object.kind_of?(Rational)
|
|
101
|
+
|
|
102
|
+
o = nil
|
|
103
|
+
|
|
104
|
+
begin
|
|
105
|
+
o = object.class.new
|
|
106
|
+
rescue ArgumentError => ae
|
|
107
|
+
return deep_clone(object)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
#
|
|
111
|
+
# some kind of collection ?
|
|
112
|
+
|
|
113
|
+
if object.kind_of?(Array)
|
|
114
|
+
object.each do |i|
|
|
115
|
+
o << fulldup(i)
|
|
116
|
+
end
|
|
117
|
+
elsif object.kind_of?(Hash)
|
|
118
|
+
object.each do |k, v|
|
|
119
|
+
o[fulldup(k)] = fulldup(v)
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
#
|
|
124
|
+
# duplicate the attributes of the object
|
|
125
|
+
|
|
126
|
+
object.instance_variables.each do |v|
|
|
127
|
+
|
|
128
|
+
#puts "v is #{v}"
|
|
129
|
+
|
|
130
|
+
value = object.instance_variable_get(v)
|
|
131
|
+
|
|
132
|
+
#puts "value is '#{value}'"
|
|
133
|
+
|
|
134
|
+
value = fulldup(value)
|
|
135
|
+
|
|
136
|
+
begin
|
|
137
|
+
o.instance_variable_set(v, value)
|
|
138
|
+
rescue
|
|
139
|
+
# ignore, must be readonly
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
o
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def OpenWFE.to_underscore (string)
|
|
147
|
+
|
|
148
|
+
string.gsub("-", "_")
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def OpenWFE.to_dash (string)
|
|
152
|
+
|
|
153
|
+
string.gsub("_", "-")
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def OpenWFE.symbol_to_name (symbol)
|
|
157
|
+
|
|
158
|
+
to_dash(symbol.to_s)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def OpenWFE.name_to_symbol (name)
|
|
162
|
+
|
|
163
|
+
return name if name.is_a?(Symbol)
|
|
164
|
+
to_underscore(name).intern
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
#
|
|
168
|
+
# Turns all the spaces in string into underscores.
|
|
169
|
+
# Returns the new String.
|
|
170
|
+
#
|
|
171
|
+
def OpenWFE.stu (s)
|
|
172
|
+
|
|
173
|
+
s.gsub("\s", "_")
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
#
|
|
177
|
+
# Returns an URI if the string is one, else returns nil.
|
|
178
|
+
# No exception is thrown by this method.
|
|
179
|
+
#
|
|
180
|
+
def OpenWFE.parse_uri (string)
|
|
181
|
+
|
|
182
|
+
return nil if string.split("\n").size > 1
|
|
183
|
+
|
|
184
|
+
begin
|
|
185
|
+
return URI::parse(string)
|
|
186
|
+
rescue Exception => e
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
nil
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
#
|
|
193
|
+
# Returns a URI instance if the given ref is a http, https, file or ftp
|
|
194
|
+
# URI. Returns nil else.
|
|
195
|
+
# The sister method parse_uri() is OK with things like mailto:, gopher:, ...
|
|
196
|
+
#
|
|
197
|
+
def OpenWFE.parse_known_uri (ref)
|
|
198
|
+
|
|
199
|
+
uri = OpenWFE::parse_uri(ref.to_s)
|
|
200
|
+
|
|
201
|
+
return nil unless uri
|
|
202
|
+
|
|
203
|
+
return uri if uri.scheme == "file"
|
|
204
|
+
return uri if uri.scheme == "http"
|
|
205
|
+
return uri if uri.scheme == "https"
|
|
206
|
+
return uri if uri.scheme == "ftp"
|
|
207
|
+
# what else ...
|
|
208
|
+
|
|
209
|
+
nil
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
#
|
|
213
|
+
# Returns true if the given string starts with the 'start' string.
|
|
214
|
+
#
|
|
215
|
+
def OpenWFE.starts_with (string, start)
|
|
216
|
+
#
|
|
217
|
+
# my favourite way of doing that would be by adding this
|
|
218
|
+
# method to the String class, but that could be intrusive
|
|
219
|
+
# (as OpenWFE is meant at first as an embeddable workflow engine).
|
|
220
|
+
#
|
|
221
|
+
return false unless string
|
|
222
|
+
return false if string.length < start.length
|
|
223
|
+
string[0, start.length] == start
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
#
|
|
227
|
+
# Returns true if the given string ends with the '_end' string.
|
|
228
|
+
#
|
|
229
|
+
def OpenWFE.ends_with (string, _end)
|
|
230
|
+
return false unless string
|
|
231
|
+
return false if string.length < _end.length
|
|
232
|
+
string[-_end.length..-1] == _end
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
#
|
|
236
|
+
# Attempts at displaying a nice stack trace
|
|
237
|
+
#
|
|
238
|
+
def OpenWFE.exception_to_s (exception)
|
|
239
|
+
s = "exception : "
|
|
240
|
+
s << "#{exception}\n"
|
|
241
|
+
s << exception.backtrace.join("\n")
|
|
242
|
+
s
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
#
|
|
246
|
+
# Pretty printing a caller() array
|
|
247
|
+
#
|
|
248
|
+
def OpenWFE.caller_to_s (start_index, max_lines=nil)
|
|
249
|
+
s = ""
|
|
250
|
+
caller(start_index + 1).each_with_index do |line, index|
|
|
251
|
+
break if max_lines and index >= max_lines
|
|
252
|
+
s << " #{line}\n"
|
|
253
|
+
end
|
|
254
|
+
s
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
#
|
|
258
|
+
# Sets the name of the current thread (the attribute :name if it is
|
|
259
|
+
# a ruby thread, the java thread name if we're in JRuby)
|
|
260
|
+
#
|
|
261
|
+
def OpenWFE.set_current_thread_name (name)
|
|
262
|
+
|
|
263
|
+
if defined?(JRUBY_VERSION)
|
|
264
|
+
require 'java'
|
|
265
|
+
java.lang.Thread.current_thread.name = "#{name} (Ruby Thread)"
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
Thread.current[:name] = name
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
#
|
|
272
|
+
# Some code for writing thinks like :
|
|
273
|
+
#
|
|
274
|
+
# if async
|
|
275
|
+
# OpenWFE::call_in_thread "launch()", self do
|
|
276
|
+
# raw_expression.apply(wi)
|
|
277
|
+
# end
|
|
278
|
+
# else
|
|
279
|
+
# raw_expression.apply(wi)
|
|
280
|
+
# end
|
|
281
|
+
#
|
|
282
|
+
# Returns the new thread instance.
|
|
283
|
+
#
|
|
284
|
+
def OpenWFE.call_in_thread (caller_name, caller_object=nil, &block)
|
|
285
|
+
|
|
286
|
+
return unless block
|
|
287
|
+
|
|
288
|
+
Thread.new do
|
|
289
|
+
|
|
290
|
+
#Thread.current[:name] = caller_name
|
|
291
|
+
set_current_thread_name caller_name
|
|
292
|
+
|
|
293
|
+
begin
|
|
294
|
+
#$SAFE = safe_level
|
|
295
|
+
#
|
|
296
|
+
# (note)
|
|
297
|
+
# doesn't work : the block inherits the safety level
|
|
298
|
+
# of its surroundings, it's a closure, ne ?
|
|
299
|
+
|
|
300
|
+
block.call
|
|
301
|
+
|
|
302
|
+
rescue Exception => e
|
|
303
|
+
msg = "#{caller_name} caught an exception\n" + exception_to_s(e)
|
|
304
|
+
if caller_object and caller_object.respond_to? :lwarn
|
|
305
|
+
caller_object.lwarn { msg }
|
|
306
|
+
else
|
|
307
|
+
puts msg
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
end
|
|
311
|
+
# returns the thread
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
#
|
|
315
|
+
# A small Timer class for debug purposes.
|
|
316
|
+
#
|
|
317
|
+
# t = Time.new
|
|
318
|
+
#
|
|
319
|
+
# # ... do something
|
|
320
|
+
#
|
|
321
|
+
# puts "that something took #{t.duration} ms"
|
|
322
|
+
#
|
|
323
|
+
class Timer
|
|
324
|
+
|
|
325
|
+
attr_reader :start
|
|
326
|
+
|
|
327
|
+
def initialize
|
|
328
|
+
@start = Time.now.to_f
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
#
|
|
332
|
+
# Returns the number of milliseconds since this Timer was
|
|
333
|
+
# instantiated.
|
|
334
|
+
#
|
|
335
|
+
def duration
|
|
336
|
+
(Time.now.to_f - @start) * 1000
|
|
337
|
+
end
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
#
|
|
342
|
+
# (2008.03.12 Deprecated, kept here for a while
|
|
343
|
+
# for backward compatibility)
|
|
344
|
+
#
|
|
345
|
+
# A simple Hash that accepts String or Symbol as lookup keys []
|
|
346
|
+
#
|
|
347
|
+
class SymbolHash < Hash
|
|
348
|
+
def [] (key)
|
|
349
|
+
super(key.to_s)
|
|
350
|
+
end
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
#
|
|
354
|
+
# Returns a version of s that is usable as or within a filename
|
|
355
|
+
# (removes for examples things like '/' or '\'...)
|
|
356
|
+
#
|
|
357
|
+
def OpenWFE.ensure_for_filename (s)
|
|
358
|
+
|
|
359
|
+
s = s.gsub(" ", "_")
|
|
360
|
+
s = s.gsub("/", "_")
|
|
361
|
+
s = s.gsub(":", "_")
|
|
362
|
+
s = s.gsub(";", "_")
|
|
363
|
+
s = s.gsub("\*", "_")
|
|
364
|
+
s = s.gsub("\\", "_")
|
|
365
|
+
s = s.gsub("\+", "_")
|
|
366
|
+
s = s.gsub("\?", "_")
|
|
367
|
+
|
|
368
|
+
s
|
|
369
|
+
end
|
|
370
|
+
|
|
371
|
+
#
|
|
372
|
+
# "my//path" -> "my/path"
|
|
373
|
+
#
|
|
374
|
+
def OpenWFE.clean_path (s)
|
|
375
|
+
s.gsub(/\/+/, "/")
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
#
|
|
379
|
+
# This method is used within the InFlowWorkItem and the CsvTable classes.
|
|
380
|
+
#
|
|
381
|
+
def OpenWFE.lookup_attribute (container, key)
|
|
382
|
+
|
|
383
|
+
key, rest = pop_key(key)
|
|
384
|
+
|
|
385
|
+
#value = nil
|
|
386
|
+
#begin
|
|
387
|
+
# value = container[key]
|
|
388
|
+
#rescue Exception => e
|
|
389
|
+
#end
|
|
390
|
+
|
|
391
|
+
value = flex_lookup(container, key)
|
|
392
|
+
|
|
393
|
+
return value unless rest
|
|
394
|
+
|
|
395
|
+
return nil unless value
|
|
396
|
+
|
|
397
|
+
lookup_attribute(value, rest)
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
#
|
|
401
|
+
# This method is used within the InFlowWorkItem and the CsvTable classes.
|
|
402
|
+
#
|
|
403
|
+
def OpenWFE.has_attribute? (container, key)
|
|
404
|
+
|
|
405
|
+
key, last_key = pop_last_key(key)
|
|
406
|
+
|
|
407
|
+
container = lookup_attribute(container, key) if key
|
|
408
|
+
|
|
409
|
+
if container.respond_to?(:has_key?)
|
|
410
|
+
|
|
411
|
+
(container.has_key?(last_key) or container.has_key?(last_key.to_s))
|
|
412
|
+
|
|
413
|
+
elsif container.is_a?(Array) and last_key.is_a?(Fixnum)
|
|
414
|
+
|
|
415
|
+
(last_key < container.length)
|
|
416
|
+
|
|
417
|
+
else
|
|
418
|
+
|
|
419
|
+
false
|
|
420
|
+
end
|
|
421
|
+
end
|
|
422
|
+
|
|
423
|
+
#
|
|
424
|
+
# Returns a list of lines matching the pattern in the given file.
|
|
425
|
+
#
|
|
426
|
+
# This is also possible :
|
|
427
|
+
#
|
|
428
|
+
# OpenWFE::grep "^..) ", "path/to/file.txt" do |line|
|
|
429
|
+
# puts " - '#{line.downcase}'"
|
|
430
|
+
# end
|
|
431
|
+
#
|
|
432
|
+
# TODO : find a ruby library and use it instead of that code
|
|
433
|
+
#
|
|
434
|
+
def OpenWFE.grep (pattern, filepath, &block)
|
|
435
|
+
|
|
436
|
+
result = []
|
|
437
|
+
r = Regexp.new pattern
|
|
438
|
+
|
|
439
|
+
File.open filepath do |file|
|
|
440
|
+
file.readlines.each do |l|
|
|
441
|
+
if r.match l
|
|
442
|
+
if block
|
|
443
|
+
block.call l
|
|
444
|
+
else
|
|
445
|
+
result << l
|
|
446
|
+
end
|
|
447
|
+
end
|
|
448
|
+
end
|
|
449
|
+
end
|
|
450
|
+
result unless block
|
|
451
|
+
end
|
|
452
|
+
|
|
453
|
+
#
|
|
454
|
+
# This method is used within the InFlowWorkItem and the CsvTable classes.
|
|
455
|
+
#
|
|
456
|
+
def OpenWFE.set_attribute (container, key, value)
|
|
457
|
+
|
|
458
|
+
i = key.rindex(".")
|
|
459
|
+
|
|
460
|
+
if not i
|
|
461
|
+
container[key] = value
|
|
462
|
+
return
|
|
463
|
+
end
|
|
464
|
+
|
|
465
|
+
container = lookup_attribute(container, key[0..i-1])
|
|
466
|
+
container[key[i+1..-1]] = value
|
|
467
|
+
end
|
|
468
|
+
|
|
469
|
+
#
|
|
470
|
+
# This method is used within the InFlowWorkItem and the CsvTable classes.
|
|
471
|
+
#
|
|
472
|
+
def OpenWFE.unset_attribute (container, key)
|
|
473
|
+
|
|
474
|
+
i = key.rindex(".")
|
|
475
|
+
|
|
476
|
+
if not i
|
|
477
|
+
container.delete key
|
|
478
|
+
return
|
|
479
|
+
end
|
|
480
|
+
|
|
481
|
+
container = lookup_attribute container, key[0..i-1]
|
|
482
|
+
|
|
483
|
+
if container.is_a?(Array)
|
|
484
|
+
|
|
485
|
+
container.delete_at key[i+1..-1].to_i
|
|
486
|
+
else
|
|
487
|
+
|
|
488
|
+
container.delete key[i+1..-1]
|
|
489
|
+
end
|
|
490
|
+
end
|
|
491
|
+
|
|
492
|
+
#
|
|
493
|
+
# Returns true if this host is currently online (has access to the web /
|
|
494
|
+
# internet).
|
|
495
|
+
#
|
|
496
|
+
def online?
|
|
497
|
+
|
|
498
|
+
require 'open-uri'
|
|
499
|
+
|
|
500
|
+
begin
|
|
501
|
+
open("http://www.openwfe.org")
|
|
502
|
+
true
|
|
503
|
+
rescue SocketError => se
|
|
504
|
+
false
|
|
505
|
+
end
|
|
506
|
+
end
|
|
507
|
+
|
|
508
|
+
protected
|
|
509
|
+
|
|
510
|
+
def OpenWFE.pop_key (key)
|
|
511
|
+
i = key.index(".")
|
|
512
|
+
return narrow(key), nil unless i
|
|
513
|
+
[ narrow(key[0..i-1]), key[i+1..-1] ]
|
|
514
|
+
end
|
|
515
|
+
|
|
516
|
+
def OpenWFE.pop_last_key (key)
|
|
517
|
+
i = key.rindex(".")
|
|
518
|
+
return nil, narrow(key) unless i
|
|
519
|
+
[ key[0..i-1], narrow(key[i+1..-1]) ]
|
|
520
|
+
end
|
|
521
|
+
|
|
522
|
+
def OpenWFE.narrow (key)
|
|
523
|
+
return 0 if key == "0"
|
|
524
|
+
i = key.to_i
|
|
525
|
+
return i if i != 0
|
|
526
|
+
key
|
|
527
|
+
end
|
|
528
|
+
|
|
529
|
+
#
|
|
530
|
+
# looks up in a container (something that has a [] method) with a key,
|
|
531
|
+
# if nothing has been found and the key is a number, turns the
|
|
532
|
+
# the number into a String a does a last lookup.
|
|
533
|
+
#
|
|
534
|
+
def OpenWFE.flex_lookup (container, key)
|
|
535
|
+
|
|
536
|
+
value = nil
|
|
537
|
+
|
|
538
|
+
begin
|
|
539
|
+
value = container[key]
|
|
540
|
+
rescue Exception => e
|
|
541
|
+
end
|
|
542
|
+
|
|
543
|
+
if value == nil and key.kind_of?(Fixnum)
|
|
544
|
+
begin
|
|
545
|
+
value = container[key.to_s]
|
|
546
|
+
rescue Exception => e
|
|
547
|
+
end
|
|
548
|
+
end
|
|
549
|
+
|
|
550
|
+
value
|
|
551
|
+
end
|
|
552
|
+
|
|
553
|
+
end
|
|
554
|
+
|