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.
Files changed (291) hide show
  1. data/README.txt +24 -0
  2. data/bin/validate-workflow.rb +89 -0
  3. data/examples/about_state.rb +81 -0
  4. data/examples/bigflow.rb +19 -0
  5. data/examples/csv_weather.rb +23 -0
  6. data/examples/engine_template.rb +247 -0
  7. data/examples/flowtracing.rb +24 -0
  8. data/examples/homeworkreview.rb +68 -0
  9. data/examples/kotoba.rb +22 -0
  10. data/examples/mano_tracker.rb +172 -0
  11. data/examples/openwferu.rb +58 -0
  12. data/examples/quotereporter.rb +157 -0
  13. data/examples/scheduler_cron_usage.rb +48 -0
  14. data/examples/scheduler_usage.rb +56 -0
  15. data/lib/openwfe.rb +41 -0
  16. data/lib/openwfe/contextual.rb +111 -0
  17. data/lib/openwfe/def.rb +46 -0
  18. data/lib/openwfe/engine.rb +37 -0
  19. data/lib/openwfe/engine/engine.rb +756 -0
  20. data/lib/openwfe/engine/expool_methods.rb +172 -0
  21. data/lib/openwfe/engine/file_persisted_engine.rb +105 -0
  22. data/lib/openwfe/engine/participant_methods.rb +133 -0
  23. data/lib/openwfe/engine/status_methods.rb +353 -0
  24. data/lib/openwfe/engine/update_exp_methods.rb +112 -0
  25. data/lib/openwfe/exceptions.rb +51 -0
  26. data/lib/openwfe/expool/errorjournal.rb +476 -0
  27. data/lib/openwfe/expool/expressionpool.rb +1144 -0
  28. data/lib/openwfe/expool/expstorage.rb +403 -0
  29. data/lib/openwfe/expool/history.rb +174 -0
  30. data/lib/openwfe/expool/journal.rb +224 -0
  31. data/lib/openwfe/expool/journal_replay.rb +321 -0
  32. data/lib/openwfe/expool/parser.rb +242 -0
  33. data/lib/openwfe/expool/representation.rb +121 -0
  34. data/lib/openwfe/expool/threadedexpstorage.rb +188 -0
  35. data/lib/openwfe/expool/wfidgen.rb +388 -0
  36. data/lib/openwfe/expool/yamlexpstorage.rb +224 -0
  37. data/lib/openwfe/expressions/condition.rb +244 -0
  38. data/lib/openwfe/expressions/environment.rb +246 -0
  39. data/lib/openwfe/expressions/expressionmap.rb +258 -0
  40. data/lib/openwfe/expressions/fe_cancel.rb +109 -0
  41. data/lib/openwfe/expressions/fe_command.rb +241 -0
  42. data/lib/openwfe/expressions/fe_concurrence.rb +662 -0
  43. data/lib/openwfe/expressions/fe_cron.rb +259 -0
  44. data/lib/openwfe/expressions/fe_cursor.rb +259 -0
  45. data/lib/openwfe/expressions/fe_define.rb +192 -0
  46. data/lib/openwfe/expressions/fe_do.rb +168 -0
  47. data/lib/openwfe/expressions/fe_equals.rb +291 -0
  48. data/lib/openwfe/expressions/fe_filter.rb +129 -0
  49. data/lib/openwfe/expressions/fe_filter_definition.rb +168 -0
  50. data/lib/openwfe/expressions/fe_fqv.rb +250 -0
  51. data/lib/openwfe/expressions/fe_if.rb +303 -0
  52. data/lib/openwfe/expressions/fe_iterator.rb +145 -0
  53. data/lib/openwfe/expressions/fe_listen.rb +371 -0
  54. data/lib/openwfe/expressions/fe_losfor.rb +111 -0
  55. data/lib/openwfe/expressions/fe_misc.rb +421 -0
  56. data/lib/openwfe/expressions/fe_participant.rb +269 -0
  57. data/lib/openwfe/expressions/fe_reserve.rb +212 -0
  58. data/lib/openwfe/expressions/fe_save.rb +274 -0
  59. data/lib/openwfe/expressions/fe_sequence.rb +117 -0
  60. data/lib/openwfe/expressions/fe_set.rb +139 -0
  61. data/lib/openwfe/expressions/fe_sleep.rb +166 -0
  62. data/lib/openwfe/expressions/fe_step.rb +159 -0
  63. data/lib/openwfe/expressions/fe_subprocess.rb +168 -0
  64. data/lib/openwfe/expressions/fe_timeout.rb +127 -0
  65. data/lib/openwfe/expressions/fe_wait.rb +78 -0
  66. data/lib/openwfe/expressions/fe_when.rb +142 -0
  67. data/lib/openwfe/expressions/filter.rb +104 -0
  68. data/lib/openwfe/expressions/flowexpression.rb +847 -0
  69. data/lib/openwfe/expressions/iterator.rb +221 -0
  70. data/lib/openwfe/expressions/merge.rb +84 -0
  71. data/lib/openwfe/expressions/raw.rb +547 -0
  72. data/lib/openwfe/expressions/rprocdef.rb +375 -0
  73. data/lib/openwfe/expressions/time.rb +333 -0
  74. data/lib/openwfe/expressions/timeout.rb +178 -0
  75. data/lib/openwfe/expressions/value.rb +126 -0
  76. data/lib/openwfe/filterdef.rb +259 -0
  77. data/lib/openwfe/flowexpressionid.rb +357 -0
  78. data/lib/openwfe/listeners/listener.rb +97 -0
  79. data/lib/openwfe/listeners/listeners.rb +139 -0
  80. data/lib/openwfe/listeners/socketlisteners.rb +272 -0
  81. data/lib/openwfe/logging.rb +122 -0
  82. data/lib/openwfe/omixins.rb +95 -0
  83. data/lib/openwfe/orest/controlclient.rb +119 -0
  84. data/lib/openwfe/orest/definitions.rb +113 -0
  85. data/lib/openwfe/orest/exception.rb +60 -0
  86. data/lib/openwfe/orest/oldrestservlet.rb +279 -0
  87. data/lib/openwfe/orest/osocket.rb +148 -0
  88. data/lib/openwfe/orest/restclient.rb +176 -0
  89. data/lib/openwfe/orest/workitem.rb +206 -0
  90. data/lib/openwfe/orest/worklistclient.rb +272 -0
  91. data/lib/openwfe/orest/xmlcodec.rb +670 -0
  92. data/lib/openwfe/participants.rb +38 -0
  93. data/lib/openwfe/participants/enoparticipants.rb +230 -0
  94. data/lib/openwfe/participants/participant.rb +141 -0
  95. data/lib/openwfe/participants/participantmap.rb +249 -0
  96. data/lib/openwfe/participants/participants.rb +407 -0
  97. data/lib/openwfe/participants/soapparticipants.rb +135 -0
  98. data/lib/openwfe/participants/socketparticipants.rb +202 -0
  99. data/lib/openwfe/participants/storeparticipants.rb +254 -0
  100. data/lib/openwfe/rudefinitions.rb +130 -0
  101. data/lib/openwfe/service.rb +103 -0
  102. data/lib/openwfe/storage/yamlcustom.rb +106 -0
  103. data/lib/openwfe/storage/yamlfilestorage.rb +245 -0
  104. data/lib/openwfe/tools/flowtracer.rb +81 -0
  105. data/lib/openwfe/util/dollar.rb +217 -0
  106. data/lib/openwfe/util/irb.rb +86 -0
  107. data/lib/openwfe/util/observable.rb +144 -0
  108. data/lib/openwfe/util/ometa.rb +62 -0
  109. data/lib/openwfe/util/workqueue.rb +124 -0
  110. data/lib/openwfe/util/xml.rb +418 -0
  111. data/lib/openwfe/utils.rb +554 -0
  112. data/lib/openwfe/version.rb +37 -0
  113. data/lib/openwfe/workitem.rb +499 -0
  114. data/lib/openwfe/worklist/oldrest.rb +244 -0
  115. data/lib/openwfe/worklist/storelocks.rb +293 -0
  116. data/lib/openwfe/worklist/storeparticipant.rb +44 -0
  117. data/lib/openwfe/worklist/worklist.rb +297 -0
  118. data/test/README.txt +27 -0
  119. data/test/back_0916_test.rb +111 -0
  120. data/test/bm/bm_1_xml_vs_prog.rb +56 -0
  121. data/test/bm/bm_2_step.rb +109 -0
  122. data/test/bm/ft_0f_5ms.rb +35 -0
  123. data/test/bm/ft_26_load.rb +210 -0
  124. data/test/bm/ft_26b_load.rb +86 -0
  125. data/test/bm/ft_26c_load.rb +97 -0
  126. data/test/bm/ft_26d_load.rb +97 -0
  127. data/test/bm/ft_recu.rb +71 -0
  128. data/test/clone_test.rb +122 -0
  129. data/test/concurrence_test.rb +77 -0
  130. data/test/condition_test.rb +155 -0
  131. data/test/console_test.rb +12 -0
  132. data/test/cron_ltest.rb +15 -0
  133. data/test/description_test.rb +87 -0
  134. data/test/eno_test.rb +76 -0
  135. data/test/expmap_test.rb +54 -0
  136. data/test/expool_20031219_0916.tgz +0 -0
  137. data/test/fe_lookup_att_test.rb +62 -0
  138. data/test/fei_test.rb +181 -0
  139. data/test/file_persisted_engine_test.rb +64 -0
  140. data/test/file_persistence_test.rb +134 -0
  141. data/test/filep_cancel_test.rb +123 -0
  142. data/test/filter_test.rb +109 -0
  143. data/test/flowtestbase.rb +351 -0
  144. data/test/ft_0.rb +68 -0
  145. data/test/ft_0b_sequence.rb +36 -0
  146. data/test/ft_0c_testname.rb +33 -0
  147. data/test/ft_0d_participant.rb +30 -0
  148. data/test/ft_0e_multibody.rb +34 -0
  149. data/test/ft_10_loop.rb +134 -0
  150. data/test/ft_11_ppd.rb +415 -0
  151. data/test/ft_11b_ppd.rb +54 -0
  152. data/test/ft_12_blockparticipant.rb +97 -0
  153. data/test/ft_13_eno.rb +52 -0
  154. data/test/ft_14_subprocess.rb +88 -0
  155. data/test/ft_14b_subprocess.rb +192 -0
  156. data/test/ft_14c_subprocess.rb +68 -0
  157. data/test/ft_15_iterator.rb +216 -0
  158. data/test/ft_15b_iterator.rb +74 -0
  159. data/test/ft_16_fqv.rb +73 -0
  160. data/test/ft_17_condition.rb +84 -0
  161. data/test/ft_18_pname.rb +56 -0
  162. data/test/ft_1_unset.rb +175 -0
  163. data/test/ft_1b_unset.rb +39 -0
  164. data/test/ft_20_cron.rb +53 -0
  165. data/test/ft_21_cron.rb +87 -0
  166. data/test/ft_21b_cron_pause.rb +82 -0
  167. data/test/ft_22_history.rb +74 -0
  168. data/test/ft_23_when.rb +77 -0
  169. data/test/ft_23b_when.rb +70 -0
  170. data/test/ft_23c_wait.rb +80 -0
  171. data/test/ft_23d_cww.rb +58 -0
  172. data/test/ft_24_def.rb +44 -0
  173. data/test/ft_25_cancel.rb +89 -0
  174. data/test/ft_27_getflowpos.rb +147 -0
  175. data/test/ft_28_fileparticipant.rb +63 -0
  176. data/test/ft_29_httprb.rb +106 -0
  177. data/test/ft_2_concurrence.rb +135 -0
  178. data/test/ft_2b_concurrence.rb +188 -0
  179. data/test/ft_2c_concurrence.rb +64 -0
  180. data/test/ft_30_socketlistener.rb +203 -0
  181. data/test/ft_31_flowname.rb +40 -0
  182. data/test/ft_32_journal.rb +91 -0
  183. data/test/ft_32c_journal.rb +102 -0
  184. data/test/ft_32d_journal.rb +84 -0
  185. data/test/ft_33_description.rb +107 -0
  186. data/test/ft_34_cancelwfid.rb +80 -0
  187. data/test/ft_35_localdefs.rb +75 -0
  188. data/test/ft_36_subprocids.rb +97 -0
  189. data/test/ft_37_pnames.rb +70 -0
  190. data/test/ft_38_tag.rb +127 -0
  191. data/test/ft_38b_tag.rb +161 -0
  192. data/test/ft_38c_tag.rb +100 -0
  193. data/test/ft_39_reserve.rb +63 -0
  194. data/test/ft_39b_reserve.rb +84 -0
  195. data/test/ft_3_equals.rb +170 -0
  196. data/test/ft_3b_lookup_vf.rb +83 -0
  197. data/test/ft_40_defined.rb +61 -0
  198. data/test/ft_41_case.rb +110 -0
  199. data/test/ft_42_environments.rb +75 -0
  200. data/test/ft_43_pat10.rb +85 -0
  201. data/test/ft_44_save.rb +70 -0
  202. data/test/ft_44b_restore.rb +212 -0
  203. data/test/ft_45_citerator.rb +214 -0
  204. data/test/ft_46_pparams.rb +62 -0
  205. data/test/ft_47_filter.rb +160 -0
  206. data/test/ft_48_fe_filter.rb +88 -0
  207. data/test/ft_49_condition.rb +126 -0
  208. data/test/ft_4_misc.rb +237 -0
  209. data/test/ft_50_xml_attribute.rb +155 -0
  210. data/test/ft_51_stack.rb +55 -0
  211. data/test/ft_52_obs_participant.rb +123 -0
  212. data/test/ft_53_null_noop_participant.rb +62 -0
  213. data/test/ft_54_listen.rb +288 -0
  214. data/test/ft_54b_listen.rb +66 -0
  215. data/test/ft_54c_listen.rb +99 -0
  216. data/test/ft_55_ptimeout.rb +59 -0
  217. data/test/ft_56_timeout.rb +59 -0
  218. data/test/ft_57_a.rb +145 -0
  219. data/test/ft_58_ejournal.rb +151 -0
  220. data/test/ft_59_ps.rb +150 -0
  221. data/test/ft_59b_ps_for_pat.rb +58 -0
  222. data/test/ft_5_time.rb +118 -0
  223. data/test/ft_60_ecancel.rb +161 -0
  224. data/test/ft_61_elsub.rb +51 -0
  225. data/test/ft_62_procparticipant.rb +71 -0
  226. data/test/ft_63_pause.rb +124 -0
  227. data/test/ft_64_alias.rb +102 -0
  228. data/test/ft_64_clone.rb +69 -0
  229. data/test/ft_65_stringlaunch.rb +59 -0
  230. data/test/ft_66_subforget.rb +70 -0
  231. data/test/ft_67_schedlaunch.rb +116 -0
  232. data/test/ft_68_ifparticipant.rb +70 -0
  233. data/test/ft_69_cancelmissing.rb +51 -0
  234. data/test/ft_6_lambda.rb +64 -0
  235. data/test/ft_70_lookupvar.rb +55 -0
  236. data/test/ft_71_log.rb +60 -0
  237. data/test/ft_72_lookup_processes.rb +76 -0
  238. data/test/ft_73_cancel_sub.rb +139 -0
  239. data/test/ft_74_block_and_workitem_dup.rb +63 -0
  240. data/test/ft_75_ruby_attributes.rb +87 -0
  241. data/test/ft_76_merge_isolate.rb +88 -0
  242. data/test/ft_77_segments.rb +35 -0
  243. data/test/ft_78_eval.rb +150 -0
  244. data/test/ft_79_tticket.rb +187 -0
  245. data/test/ft_79b_tticket.rb +172 -0
  246. data/test/ft_79c_outcome.rb +56 -0
  247. data/test/ft_7_lose.rb +104 -0
  248. data/test/ft_7b_lose.rb +78 -0
  249. data/test/ft_80_spname.rb +91 -0
  250. data/test/ft_81_exp.rb +60 -0
  251. data/test/ft_82_trecu.rb +46 -0
  252. data/test/ft_83_badpause.rb +58 -0
  253. data/test/ft_84_updateexp.rb +198 -0
  254. data/test/ft_85_dolhash.rb +43 -0
  255. data/test/ft_86_dollar_fv.rb +68 -0
  256. data/test/ft_87_define.rb +74 -0
  257. data/test/ft_8_forget.rb +44 -0
  258. data/test/ft_9_cursor.rb +145 -0
  259. data/test/ft_9b_cursor.rb +105 -0
  260. data/test/ft_tests.rb +124 -0
  261. data/test/hash_test.rb +75 -0
  262. data/test/hparticipant_test.rb +164 -0
  263. data/test/lookup_att_test.rb +90 -0
  264. data/test/lookup_vf_test.rb +94 -0
  265. data/test/misc_test.rb +90 -0
  266. data/test/nut_0_irb.rb +20 -0
  267. data/test/obs_test.rb +142 -0
  268. data/test/orest_test.rb +251 -0
  269. data/test/param_test.rb +290 -0
  270. data/test/participant_test.rb +101 -0
  271. data/test/pending.rb +23 -0
  272. data/test/ps_representation.rb +133 -0
  273. data/test/rake_ltest.rb +38 -0
  274. data/test/rake_qtest.rb +68 -0
  275. data/test/raw_prog_test.rb +412 -0
  276. data/test/restart_cron_test.rb +136 -0
  277. data/test/restart_paused_test.rb +98 -0
  278. data/test/restart_sleep_test.rb +140 -0
  279. data/test/restart_tests.rb +18 -0
  280. data/test/restart_when_test.rb +112 -0
  281. data/test/ruby_procdef_test.rb +132 -0
  282. data/test/rutest_utils.rb +63 -0
  283. data/test/sec_test.rb +205 -0
  284. data/test/slock_test.rb +80 -0
  285. data/test/storage_test.rb +44 -0
  286. data/test/test.rb +3 -0
  287. data/test/timeout_test.rb +105 -0
  288. data/test/util_xml_test.rb +112 -0
  289. data/test/wfid_test.rb +175 -0
  290. data/test/wi_test.rb +75 -0
  291. 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
+