ruote 0.9.18 → 0.9.19

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