ruote 0.9.19 → 0.9.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (401) hide show
  1. data/README.txt +16 -6
  2. data/examples/engine_template.rb +6 -43
  3. data/examples/quickstart.rb +87 -0
  4. data/examples/quotereporter.rb +42 -49
  5. data/examples/simple.rb +56 -0
  6. data/lib/openwfe.rb +20 -34
  7. data/lib/openwfe/contextual.rb +45 -36
  8. data/lib/openwfe/def.rb +21 -30
  9. data/lib/openwfe/engine.rb +17 -26
  10. data/lib/openwfe/engine/engine.rb +132 -397
  11. data/lib/openwfe/engine/expool_methods.rb +34 -122
  12. data/lib/openwfe/engine/file_persisted_engine.rb +39 -60
  13. data/lib/openwfe/engine/fs_engine.rb +54 -0
  14. data/lib/openwfe/engine/launch_methods.rb +245 -0
  15. data/lib/openwfe/engine/listener_methods.rb +128 -0
  16. data/lib/openwfe/engine/lookup_methods.rb +156 -0
  17. data/lib/openwfe/engine/participant_methods.rb +60 -52
  18. data/lib/openwfe/engine/status_methods.rb +102 -97
  19. data/lib/openwfe/engine/tc_engine.rb +55 -0
  20. data/lib/openwfe/engine/tt_engine.rb +55 -0
  21. data/lib/openwfe/engine/update_exp_methods.rb +46 -39
  22. data/lib/openwfe/expool/def_parser.rb +196 -0
  23. data/lib/openwfe/expool/errorjournal.rb +51 -219
  24. data/lib/openwfe/expool/errors.rb +69 -0
  25. data/lib/openwfe/expool/expool_pause_methods.rb +32 -43
  26. data/lib/openwfe/expool/expressionpool.rb +398 -594
  27. data/lib/openwfe/expool/expstorage.rb +68 -72
  28. data/lib/openwfe/expool/fs_expstorage.rb +302 -0
  29. data/lib/openwfe/expool/history.rb +54 -38
  30. data/lib/openwfe/expool/journal.rb +24 -38
  31. data/lib/openwfe/expool/journal_replay.rb +20 -36
  32. data/lib/openwfe/expool/representation.rb +62 -78
  33. data/lib/openwfe/expool/tc_expstorage.rb +239 -0
  34. data/lib/openwfe/expool/{threadedexpstorage.rb → threaded_expstorage.rb} +25 -53
  35. data/lib/openwfe/expool/tt_expstorage.rb +55 -0
  36. data/lib/openwfe/expool/wfidgen.rb +23 -43
  37. data/lib/openwfe/expool/yaml_errorjournal.rb +187 -0
  38. data/lib/openwfe/expressions/condition.rb +33 -58
  39. data/lib/openwfe/expressions/environment.rb +62 -76
  40. data/lib/openwfe/expressions/{expressionmap.rb → expression_map.rb} +40 -54
  41. data/lib/openwfe/expressions/expression_tree.rb +265 -0
  42. data/lib/openwfe/expressions/fe_cancel.rb +19 -39
  43. data/lib/openwfe/expressions/fe_command.rb +80 -84
  44. data/lib/openwfe/expressions/fe_concurrence.rb +250 -313
  45. data/lib/openwfe/expressions/fe_cron.rb +38 -55
  46. data/lib/openwfe/expressions/fe_cursor.rb +49 -74
  47. data/lib/openwfe/expressions/fe_define.rb +44 -90
  48. data/lib/openwfe/expressions/fe_do.rb +83 -70
  49. data/lib/openwfe/expressions/fe_equals.rb +17 -35
  50. data/lib/openwfe/expressions/fe_error.rb +103 -0
  51. data/lib/openwfe/expressions/fe_filter.rb +27 -44
  52. data/lib/openwfe/expressions/fe_filter_definition.rb +37 -54
  53. data/lib/openwfe/expressions/fe_fqv.rb +46 -65
  54. data/lib/openwfe/expressions/fe_http.rb +17 -31
  55. data/lib/openwfe/expressions/fe_if.rb +39 -55
  56. data/lib/openwfe/expressions/fe_iterator.rb +25 -42
  57. data/lib/openwfe/expressions/fe_listen.rb +71 -115
  58. data/lib/openwfe/expressions/fe_losfor.rb +34 -43
  59. data/lib/openwfe/expressions/fe_misc.rb +70 -109
  60. data/lib/openwfe/expressions/fe_participant.rb +61 -99
  61. data/lib/openwfe/expressions/fe_reserve.rb +28 -59
  62. data/lib/openwfe/expressions/fe_save.rb +62 -81
  63. data/lib/openwfe/expressions/fe_sequence.rb +45 -70
  64. data/lib/openwfe/expressions/fe_set.rb +22 -40
  65. data/lib/openwfe/expressions/fe_step.rb +22 -37
  66. data/lib/openwfe/expressions/fe_subprocess.rb +34 -55
  67. data/lib/openwfe/expressions/fe_timeout.rb +28 -44
  68. data/lib/openwfe/expressions/fe_wait.rb +142 -36
  69. data/lib/openwfe/expressions/fe_when.rb +22 -46
  70. data/lib/openwfe/expressions/filter.rb +24 -43
  71. data/lib/openwfe/expressions/flowexpression.rb +211 -192
  72. data/lib/openwfe/expressions/iterator.rb +24 -39
  73. data/lib/openwfe/expressions/merge.rb +30 -52
  74. data/lib/openwfe/expressions/raw.rb +168 -384
  75. data/lib/openwfe/expressions/rprocdef.rb +79 -76
  76. data/lib/openwfe/expressions/time.rb +89 -103
  77. data/lib/openwfe/expressions/timeout.rb +98 -92
  78. data/lib/openwfe/expressions/value.rb +43 -69
  79. data/lib/openwfe/extras/engine/ar_engine.rb +58 -0
  80. data/lib/openwfe/extras/engine/db_persisted_engine.rb +37 -57
  81. data/lib/openwfe/extras/engine/dm_engine.rb +59 -0
  82. data/lib/openwfe/extras/expool/ar_expstorage.rb +337 -0
  83. data/lib/openwfe/extras/expool/db_errorjournal.rb +165 -0
  84. data/lib/openwfe/extras/expool/db_expstorage.rb +73 -0
  85. data/lib/openwfe/extras/expool/db_history.rb +163 -0
  86. data/lib/openwfe/extras/expool/dm_expstorage.rb +327 -0
  87. data/lib/openwfe/extras/listeners/jabber_listeners.rb +102 -0
  88. data/lib/openwfe/extras/listeners/jabberlisteners.rb +26 -0
  89. data/lib/openwfe/extras/listeners/sqs_listeners.rb +128 -0
  90. data/lib/openwfe/extras/misc/activityfeed.rb +19 -34
  91. data/lib/openwfe/extras/misc/jabber_common.rb +122 -0
  92. data/lib/openwfe/extras/participants/active_participants.rb +724 -0
  93. data/lib/openwfe/extras/participants/active_resource_participants.rb +213 -0
  94. data/lib/openwfe/extras/participants/activeparticipants.rb +1 -747
  95. data/lib/openwfe/extras/participants/ar_participants.rb +285 -0
  96. data/lib/openwfe/extras/participants/atomfeed_participants.rb +19 -34
  97. data/lib/openwfe/extras/participants/atompub_participants.rb +19 -34
  98. data/lib/openwfe/extras/participants/basecamp_participants.rb +17 -31
  99. data/lib/openwfe/extras/participants/{csvparticipants.rb → decision_participants.rb} +17 -31
  100. data/lib/openwfe/extras/participants/jabber_participants.rb +147 -0
  101. data/lib/openwfe/extras/participants/jabberparticipants.rb +3 -0
  102. data/lib/openwfe/extras/participants/sqs_participants.rb +108 -0
  103. data/lib/openwfe/extras/participants/{twitterparticipants.rb → twitter_participants.rb} +20 -34
  104. data/lib/openwfe/extras/singlecon.rb +56 -0
  105. data/lib/openwfe/filterdef.rb +83 -65
  106. data/lib/openwfe/flowexpressionid.rb +99 -62
  107. data/lib/openwfe/listeners/listener.rb +54 -65
  108. data/lib/openwfe/listeners/listeners.rb +52 -56
  109. data/lib/openwfe/logging.rb +17 -31
  110. data/lib/openwfe/omixins.rb +25 -58
  111. data/lib/openwfe/participants.rb +1 -34
  112. data/lib/openwfe/participants/{enoparticipants.rb → mail_participants.rb} +33 -47
  113. data/lib/openwfe/participants/participant.rb +37 -36
  114. data/lib/openwfe/participants/participant_map.rb +245 -0
  115. data/lib/openwfe/participants/participants.rb +43 -69
  116. data/lib/openwfe/participants/{soapparticipants.rb → soap_participants.rb} +22 -36
  117. data/lib/openwfe/participants/{storeparticipants.rb → store_participants.rb} +57 -62
  118. data/lib/openwfe/{storage/yamlfilestorage.rb → participants/yaml_filestorage.rb} +35 -64
  119. data/lib/openwfe/representations.rb +770 -0
  120. data/lib/openwfe/rudefinitions.rb +17 -29
  121. data/lib/openwfe/service.rb +21 -32
  122. data/lib/openwfe/tools/flowtracer.rb +21 -35
  123. data/lib/openwfe/util/dollar.rb +48 -61
  124. data/lib/openwfe/util/irb.rb +19 -34
  125. data/lib/openwfe/util/json.rb +55 -0
  126. data/lib/openwfe/util/observable.rb +22 -41
  127. data/lib/openwfe/util/ometa.rb +21 -35
  128. data/lib/openwfe/util/treechecker.rb +17 -31
  129. data/lib/openwfe/util/workqueue.rb +45 -44
  130. data/lib/openwfe/util/xml.rb +80 -234
  131. data/lib/openwfe/utils.rb +67 -110
  132. data/lib/openwfe/version.rb +19 -27
  133. data/lib/openwfe/workitem.rb +119 -84
  134. data/lib/openwfe/worklist/storelocks.rb +17 -33
  135. data/lib/openwfe/worklist/storeparticipant.rb +1 -39
  136. data/lib/openwfe/worklist/worklist.rb +17 -31
  137. data/lib/pooltool.ru +311 -0
  138. data/test/{extras/active_connection.rb → ar_test_connection.rb} +26 -11
  139. data/test/bm/fatxml.rb +70 -0
  140. data/test/bm/load_26c.rb +79 -0
  141. data/test/dm_test_connection.rb +11 -0
  142. data/test/extras/base.rb +3 -0
  143. data/test/extras/et_0_sqs.rb +37 -0
  144. data/test/extras/et_jabber_test.rb +226 -0
  145. data/test/extras/test.rb +16 -0
  146. data/test/functional/base.rb +198 -0
  147. data/test/functional/db_ft_0_ar_participants.rb +136 -0
  148. data/test/functional/eft_0_process_definition.rb +34 -0
  149. data/test/functional/eft_10_unset.rb +60 -0
  150. data/test/functional/eft_11_sleep.rb +95 -0
  151. data/test/functional/eft_12_wait.rb +57 -0
  152. data/test/functional/eft_13_cursor.rb +139 -0
  153. data/test/functional/eft_14_loop.rb +36 -0
  154. data/test/functional/eft_15_undo.rb +77 -0
  155. data/test/functional/eft_16_redo.rb +88 -0
  156. data/test/functional/eft_1_print.rb +57 -0
  157. data/test/functional/eft_2_sequence.rb +47 -0
  158. data/test/functional/eft_3_equals.rb +98 -0
  159. data/test/functional/eft_4_if.rb +96 -0
  160. data/test/functional/eft_5_eval.rb +89 -0
  161. data/test/functional/eft_6_reval.rb +101 -0
  162. data/test/functional/eft_7_exp.rb +47 -0
  163. data/test/functional/eft_8_log.rb +50 -0
  164. data/test/functional/eft_9_set.rb +132 -0
  165. data/test/functional/engine_helper.rb +122 -0
  166. data/test/functional/ft_0_vars_at_launch.rb +27 -0
  167. data/test/functional/ft_1_process_status.rb +46 -0
  168. data/test/functional/ft_2_file_listener.rb +45 -0
  169. data/test/functional/ft_3_on_cancel.rb +171 -0
  170. data/test/functional/ft_4_on_error.rb +220 -0
  171. data/test/functional/ft_5_process_uri.rb +82 -0
  172. data/test/functional/ft_6_process_status.rb +62 -0
  173. data/test/functional/ft_7_parameters.rb +103 -0
  174. data/test/functional/ft_8_dollar.rb +53 -0
  175. data/test/functional/ft_9_register_participants.rb +119 -0
  176. data/test/functional/restart_base.rb +43 -0
  177. data/test/functional/rft_0_sleep.rb +76 -0
  178. data/test/functional/test.rb +24 -0
  179. data/test/path_helper.rb +12 -0
  180. data/test/test.rb +11 -1
  181. data/test/{rutest_utils.rb → test_helper.rb} +8 -31
  182. data/test/unit/test.rb +19 -0
  183. data/test/{fei_test.rb → unit/ut_0_fei.rb} +34 -49
  184. data/test/unit/ut_10_lookup_attribute.rb +86 -0
  185. data/test/unit/ut_11_filter.rb +124 -0
  186. data/test/{condition_test.rb → unit/ut_12_conditional.rb} +33 -40
  187. data/test/unit/ut_13_xmlutil.rb +57 -0
  188. data/test/unit/ut_14_var_field_lookup.rb +85 -0
  189. data/test/{fe_lookup_att_test.rb → unit/ut_15_fe_att_lookup.rb} +14 -21
  190. data/test/{storage_test.rb → unit/ut_16_expstorage_findexp.rb} +3 -9
  191. data/test/unit/ut_17_representations.rb +330 -0
  192. data/test/{hash_test.rb → unit/ut_17b_representations_hash.rb} +25 -21
  193. data/test/{slock_test.rb → unit/ut_18_store_lock.rb} +17 -20
  194. data/test/{wfid_test.rb → unit/ut_1_wfid.rb} +2 -73
  195. data/test/unit/ut_2_utils.rb +53 -0
  196. data/test/unit/ut_3_expmap.rb +65 -0
  197. data/test/{clone_test.rb → unit/ut_4_fulldup.rb} +41 -46
  198. data/test/{obs_test.rb → unit/ut_5_observable.rb} +9 -19
  199. data/test/unit/ut_6_treechecker.rb +101 -0
  200. data/test/unit/ut_7_parser_ruby.rb +344 -0
  201. data/test/unit/ut_7b_parser_ruby.rb +56 -0
  202. data/test/{description_test.rb → unit/ut_8_parser_description.rb} +8 -19
  203. data/test/unit/ut_9_workitem.rb +72 -0
  204. metadata +117 -234
  205. data/lib/openwfe/exceptions.rb +0 -51
  206. data/lib/openwfe/expool/parser.rb +0 -278
  207. data/lib/openwfe/expool/paused_error.rb +0 -77
  208. data/lib/openwfe/expool/yamlexpstorage.rb +0 -224
  209. data/lib/openwfe/expressions/fe_sleep.rb +0 -173
  210. data/lib/openwfe/extras/expool/dberrorjournal.rb +0 -189
  211. data/lib/openwfe/extras/expool/dbexpstorage.rb +0 -355
  212. data/lib/openwfe/extras/expool/dbhistory.rb +0 -135
  213. data/lib/openwfe/extras/listeners/sqslisteners.rb +0 -146
  214. data/lib/openwfe/extras/participants/sqsparticipants.rb +0 -125
  215. data/lib/openwfe/listeners/socketlisteners.rb +0 -272
  216. data/lib/openwfe/orest/definitions.rb +0 -113
  217. data/lib/openwfe/orest/osocket.rb +0 -148
  218. data/lib/openwfe/orest/xmlcodec.rb +0 -682
  219. data/lib/openwfe/participants/participantmap.rb +0 -249
  220. data/lib/openwfe/participants/socketparticipants.rb +0 -202
  221. data/lib/openwfe/storage/yamlcustom.rb +0 -106
  222. data/lib/openwfe/worklist/oldrest.rb +0 -244
  223. data/test/README.txt +0 -27
  224. data/test/back_0916_test.rb +0 -109
  225. data/test/bm/bm_1_xml_vs_prog.rb +0 -59
  226. data/test/bm/bm_2_step.rb +0 -109
  227. data/test/bm/ft_0f_5ms.rb +0 -35
  228. data/test/bm/ft_26_load.rb +0 -208
  229. data/test/bm/ft_26b_load.rb +0 -84
  230. data/test/bm/ft_26c_load.rb +0 -102
  231. data/test/bm/ft_recu.rb +0 -71
  232. data/test/concurrence_test.rb +0 -77
  233. data/test/console_test.rb +0 -12
  234. data/test/cron_ltest.rb +0 -15
  235. data/test/eno_test.rb +0 -76
  236. data/test/expmap_test.rb +0 -54
  237. data/test/expool_20031219_0916.tgz +0 -0
  238. data/test/extras/README.txt +0 -5
  239. data/test/extras/active_with_engine_test.rb +0 -140
  240. data/test/extras/activityfeed_test.rb +0 -85
  241. data/test/extras/ap_0_test.rb +0 -287
  242. data/test/extras/ap_1_test.rb +0 -53
  243. data/test/extras/ap_test_base.rb +0 -24
  244. data/test/extras/atomfeedp_test.rb +0 -113
  245. data/test/extras/atompubp_test.rb +0 -91
  246. data/test/extras/basecamp_test.rb +0 -53
  247. data/test/extras/db_errorjournal_utest.rb +0 -75
  248. data/test/extras/db_expstorage_utest.rb +0 -171
  249. data/test/extras/db_history_0_test.rb +0 -58
  250. data/test/extras/ft_19_csv.rb +0 -58
  251. data/test/extras/ft_71_b14008.rb +0 -85
  252. data/test/extras/sqs_test.rb +0 -57
  253. data/test/extras/twitter_test.rb +0 -62
  254. data/test/file_persisted_engine_test.rb +0 -64
  255. data/test/file_persistence_test.rb +0 -135
  256. data/test/filep_cancel_test.rb +0 -123
  257. data/test/filter_test.rb +0 -109
  258. data/test/flowtestbase.rb +0 -339
  259. data/test/ft_0.rb +0 -68
  260. data/test/ft_0b_sequence.rb +0 -36
  261. data/test/ft_0c_testname.rb +0 -33
  262. data/test/ft_0d_participant.rb +0 -30
  263. data/test/ft_0e_multibody.rb +0 -34
  264. data/test/ft_10_loop.rb +0 -133
  265. data/test/ft_11_ppd.rb +0 -411
  266. data/test/ft_11b_ppd.rb +0 -54
  267. data/test/ft_12_blockparticipant.rb +0 -97
  268. data/test/ft_13_eno.rb +0 -52
  269. data/test/ft_14_subprocess.rb +0 -88
  270. data/test/ft_14b_subprocess.rb +0 -192
  271. data/test/ft_14c_subprocess.rb +0 -68
  272. data/test/ft_15_iterator.rb +0 -216
  273. data/test/ft_15b_iterator.rb +0 -74
  274. data/test/ft_16_fqv.rb +0 -73
  275. data/test/ft_17_condition.rb +0 -84
  276. data/test/ft_18_pname.rb +0 -56
  277. data/test/ft_1_unset.rb +0 -175
  278. data/test/ft_1b_unset.rb +0 -39
  279. data/test/ft_20_cron.rb +0 -53
  280. data/test/ft_21_cron.rb +0 -87
  281. data/test/ft_21b_cron_pause.rb +0 -82
  282. data/test/ft_22_history.rb +0 -78
  283. data/test/ft_23_when.rb +0 -77
  284. data/test/ft_23b_when.rb +0 -70
  285. data/test/ft_23c_wait.rb +0 -80
  286. data/test/ft_23d_cww.rb +0 -58
  287. data/test/ft_24_def.rb +0 -44
  288. data/test/ft_25_cancel.rb +0 -92
  289. data/test/ft_27_getflowpos.rb +0 -143
  290. data/test/ft_28_fileparticipant.rb +0 -63
  291. data/test/ft_29_httprb.rb +0 -106
  292. data/test/ft_2_concurrence.rb +0 -137
  293. data/test/ft_2b_concurrence.rb +0 -188
  294. data/test/ft_2c_concurrence.rb +0 -64
  295. data/test/ft_30_socketlistener.rb +0 -203
  296. data/test/ft_31_flowname.rb +0 -39
  297. data/test/ft_32_journal.rb +0 -91
  298. data/test/ft_32c_journal.rb +0 -102
  299. data/test/ft_32d_journal.rb +0 -81
  300. data/test/ft_33_description.rb +0 -107
  301. data/test/ft_34_cancelwfid.rb +0 -80
  302. data/test/ft_35_localdefs.rb +0 -77
  303. data/test/ft_36_subprocids.rb +0 -97
  304. data/test/ft_37_pnames.rb +0 -70
  305. data/test/ft_38_tag.rb +0 -127
  306. data/test/ft_38b_tag.rb +0 -161
  307. data/test/ft_38c_tag.rb +0 -100
  308. data/test/ft_38d_tag.rb +0 -53
  309. data/test/ft_39_reserve.rb +0 -63
  310. data/test/ft_39b_reserve.rb +0 -84
  311. data/test/ft_3_equals.rb +0 -170
  312. data/test/ft_3b_lookup_vf.rb +0 -83
  313. data/test/ft_40_defined.rb +0 -61
  314. data/test/ft_41_case.rb +0 -110
  315. data/test/ft_42_environments.rb +0 -75
  316. data/test/ft_43_pat10.rb +0 -85
  317. data/test/ft_44_save.rb +0 -70
  318. data/test/ft_44b_restore.rb +0 -212
  319. data/test/ft_45_citerator.rb +0 -214
  320. data/test/ft_45b_citerator.rb +0 -77
  321. data/test/ft_46_pparams.rb +0 -62
  322. data/test/ft_47_filter.rb +0 -160
  323. data/test/ft_48_fe_filter.rb +0 -88
  324. data/test/ft_49_condition.rb +0 -133
  325. data/test/ft_4_misc.rb +0 -232
  326. data/test/ft_50_xml_attribute.rb +0 -152
  327. data/test/ft_51_stack.rb +0 -55
  328. data/test/ft_52_obs_participant.rb +0 -123
  329. data/test/ft_53_null_noop_participant.rb +0 -62
  330. data/test/ft_54_listen.rb +0 -288
  331. data/test/ft_54b_listen.rb +0 -66
  332. data/test/ft_54c_listen.rb +0 -99
  333. data/test/ft_55_ptimeout.rb +0 -58
  334. data/test/ft_56_timeout.rb +0 -59
  335. data/test/ft_57_a.rb +0 -148
  336. data/test/ft_58_ejournal.rb +0 -154
  337. data/test/ft_58b_ejournal.rb +0 -82
  338. data/test/ft_59_ps.rb +0 -212
  339. data/test/ft_5_time.rb +0 -118
  340. data/test/ft_60_ecancel.rb +0 -161
  341. data/test/ft_61_elsub.rb +0 -51
  342. data/test/ft_62_procparticipant.rb +0 -71
  343. data/test/ft_63_pause.rb +0 -137
  344. data/test/ft_64_alias.rb +0 -101
  345. data/test/ft_65_stringlaunch.rb +0 -59
  346. data/test/ft_66_subforget.rb +0 -70
  347. data/test/ft_67_schedlaunch.rb +0 -115
  348. data/test/ft_68_ifparticipant.rb +0 -70
  349. data/test/ft_69_cancelmissing.rb +0 -53
  350. data/test/ft_6_lambda.rb +0 -64
  351. data/test/ft_70_lookupvar.rb +0 -55
  352. data/test/ft_71_log.rb +0 -60
  353. data/test/ft_72_lookup_processes.rb +0 -79
  354. data/test/ft_73_cancel_sub.rb +0 -139
  355. data/test/ft_74_block_and_workitem_dup.rb +0 -63
  356. data/test/ft_75_ruby_attributes.rb +0 -89
  357. data/test/ft_76_merge_isolate.rb +0 -88
  358. data/test/ft_77_segments.rb +0 -35
  359. data/test/ft_78_eval.rb +0 -150
  360. data/test/ft_79_tticket.rb +0 -187
  361. data/test/ft_79b_tticket.rb +0 -172
  362. data/test/ft_79c_outcome.rb +0 -56
  363. data/test/ft_7_lose.rb +0 -104
  364. data/test/ft_7b_lose.rb +0 -78
  365. data/test/ft_80_spname.rb +0 -91
  366. data/test/ft_81_exp.rb +0 -60
  367. data/test/ft_82_trecu.rb +0 -52
  368. data/test/ft_83_badpause.rb +0 -58
  369. data/test/ft_84_updateexp.rb +0 -198
  370. data/test/ft_84b_subrepr.rb +0 -72
  371. data/test/ft_85_dolhash.rb +0 -43
  372. data/test/ft_86_dollar_fv.rb +0 -68
  373. data/test/ft_87_define.rb +0 -74
  374. data/test/ft_88_http.rb +0 -100
  375. data/test/ft_8_forget.rb +0 -44
  376. data/test/ft_9_cursor.rb +0 -154
  377. data/test/ft_9b_cursor.rb +0 -105
  378. data/test/ft_tests.rb +0 -130
  379. data/test/hparticipant_test.rb +0 -168
  380. data/test/lookup_att_test.rb +0 -90
  381. data/test/lookup_vf_test.rb +0 -94
  382. data/test/misc_test.rb +0 -94
  383. data/test/nut_0_irb.rb +0 -20
  384. data/test/param_test.rb +0 -290
  385. data/test/participant_test.rb +0 -101
  386. data/test/pending.rb +0 -23
  387. data/test/ps_representation.rb +0 -133
  388. data/test/rake_ltest.rb +0 -38
  389. data/test/rake_qtest.rb +0 -68
  390. data/test/raw_prog_test.rb +0 -407
  391. data/test/restart_cron_test.rb +0 -136
  392. data/test/restart_paused_test.rb +0 -103
  393. data/test/restart_sleep_test.rb +0 -140
  394. data/test/restart_tests.rb +0 -18
  395. data/test/restart_when_test.rb +0 -112
  396. data/test/ruby_procdef_test.rb +0 -132
  397. data/test/sec_test.rb +0 -206
  398. data/test/timeout_test.rb +0 -105
  399. data/test/treechecker_test.rb +0 -111
  400. data/test/util_xml_test.rb +0 -112
  401. data/test/wi_test.rb +0 -75
@@ -0,0 +1,213 @@
1
+ #--
2
+ # Copyright (c) 2008-2009, Torsten Schönebaum, John Mettraux (OpenWFE.org)
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in
12
+ # all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+ #
22
+ # Made in Europe and Japan.
23
+ #++
24
+
25
+
26
+ require 'activeresource' # gem activeresource
27
+
28
+ require 'openwfe/participants/participants'
29
+
30
+
31
+ module OpenWFE
32
+ module Extras
33
+
34
+ #
35
+ # Ruote participant which does a REST call. It's using ActiveResource to do
36
+ # the actual magic. You can call every class and instance method
37
+ # ActiveResource::Base and its mixins provide. You can also process the
38
+ # response of the REST request and save some of its data into the workitem
39
+ # for example.
40
+ #
41
+ # Before using this participant you *really* should make yourself familiar
42
+ # with ActiveResource and its usage.
43
+ #
44
+ # ==Using it
45
+ #
46
+ # The participant should be registered in the engine in a way like this:
47
+ #
48
+ # engine.register_participant(
49
+ # 'reminder',
50
+ # ActiveResourceParticipant.new(
51
+ # {
52
+ # :site => 'http://localhost:7000',
53
+ # :resource_name => 'story',
54
+ # :method => 'put', # we will use ActiveResource::CustomMethods::InstanceMethods#put
55
+ # :argument => 'send_reminder', # put is happy with just one
56
+ # # parameter: The action to be
57
+ # # called. So we won't have to use a
58
+ # # block to set the arguments of the
59
+ # # ActiveResource method to call.
60
+ # }
61
+ # )
62
+ # )
63
+ #
64
+ # Let's try a more complex example:
65
+ #
66
+ # engine.register_participant(
67
+ # 'complex_ares',
68
+ # ActiveResourceParticipant.new(
69
+ # {
70
+ # :site => 'http://localhost:7000',
71
+ # :resource_name => 'story',
72
+ # :method => 'find', # yes, even ActiveResource::Base#find method
73
+ # # may be used...
74
+ # :response_handling => proc do |response, workitem| # define response
75
+ # # handling block
76
+ # workitem.set_attribute('title', response.attributes['title'])
77
+ # # The type of the response object depends on
78
+ # # the method you use!
79
+ # end
80
+ # }
81
+ # ) do |workitem| # define arguments to use with the find method
82
+ # # each argument is an entry in an array the block has to return
83
+ # [
84
+ # workitem.attributes['story_id'], # the first argument
85
+ # {:prefix => 'foo'} # the second one is an hash
86
+ # ]
87
+ # end
88
+ # )
89
+ #
90
+ # You can now use the participant in your workflow definitions. An example
91
+ # using XML:
92
+ #
93
+ # <concurrence count="1">
94
+ # <participant ref="qa" />
95
+ # <cron every="1m">
96
+ # <participant
97
+ # ref="reminder"
98
+ # site="http://localhost:7000"
99
+ # resource_name="story"
100
+ # method="put"
101
+ # action="send_reminder"
102
+ # resource_id="${field:story_id}" />
103
+ # </cron>
104
+ # </concurrence>
105
+ #
106
+ # Here, the ActiveResourceParticipant is used to send a reminder.
107
+ #
108
+ # *Note:* prefer configuration of the participant at registration time,
109
+ # information like 'method', 'site' and 'resource_name' may clutter the
110
+ # process definition.
111
+ #
112
+ class ActiveResourceParticipant
113
+ include OpenWFE::LocalParticipant
114
+
115
+ #
116
+ # == options hash
117
+ #
118
+ # You have to set some default options by passing an options hash to the
119
+ # new method. It should contain the following keys:
120
+ #
121
+ # <tt>:site</tt>:: The URI (as string) of the site where your REST
122
+ # interface sits. See <tt>site</tt> parameter in ActiveResource::Base.
123
+ # <tt>:resource_name</tt>:: The name of the resource you like to access.
124
+ # See <tt>element_name</tt> parameter in ActiveResource::Base.
125
+ # <tt>:method</tt>:: The ActiveResource method to call. In most cases
126
+ # should be "get", "put", "post" or "delete".
127
+ # <tt>:argument</tt>:: The first parameter which should be used as
128
+ # argument to the ActiveResource method which will be called. This value
129
+ # is ignored if a block is given (see below)
130
+ # <tt>:resource_id</tt>:: The ID of the resource on which the action
131
+ # should be called on default. If negative, nil or false, the action
132
+ # will be called on the complete set of resources instead of on a single
133
+ # resource determined by its ID.
134
+ # <tt>:response_handling</tt>:: A proc object / block which gets called
135
+ # after the request is done. It gets called with to arguments: The
136
+ # response of the ActiveResource method called and the workitem.
137
+ #
138
+ # The new method also takes a block. It may be used to set the arguments
139
+ # of the ActiveResource method to call. The block must return an array of
140
+ # arguments. The array will be splitted and each entry will be used as
141
+ # argument to the ActiveResource method called. See
142
+ # OpenWFE::LocalParticipant#call_block for the arguments the block itself
143
+ # takes.
144
+ #
145
+ # All parameters except response_handling and the block set default values
146
+ # -- you can always override them in the process definition. Just use the
147
+ # corresponding symbol name (without ":") as attribute.
148
+ #
149
+ def initialize (options, &block)
150
+
151
+ @options = options
152
+
153
+ # some defaults
154
+ @options[:site] ||= 'http://127.0.0.1:3000'
155
+ @options[:method] ||= :get
156
+
157
+ @block = block
158
+ end
159
+
160
+ #
161
+ # This method is called each time the participant receives a workitem. It
162
+ # calls the requested ActiveResource method, calls the response handling
163
+ # code if present and then immediatly replies to the engine.
164
+ #
165
+ def consume (workitem)
166
+
167
+ # use block to determine the method's arguments if given
168
+ args = if @block
169
+ call_block(@block, workitem)
170
+ elsif a = param(workitem, :arg) || param(workitem, :argument)
171
+ Array(a)
172
+ else
173
+ [] # no arguments
174
+ end
175
+
176
+ # create new subclass of ActiveResource::Base
177
+ active_resource_class = Class.new(ActiveResource::Base)
178
+ active_resource_class.site = param(workitem, :site) # set site parameter
179
+ active_resource_class.element_name = param(workitem, :resource_name) # set element name
180
+
181
+ # Do we work on a single or on a set of resources? If resource_id is nil
182
+ # or negative, it's a set of resources.
183
+
184
+ resource_id = param(workitem, :resource_id)
185
+
186
+ active_resource = if (!resource_id) || (resource_id.to_i < 0)
187
+ # set of resources
188
+ active_resource_class
189
+ else
190
+ # specific resource
191
+ active_resource_class.new(:id => resource_id)
192
+ end
193
+
194
+ response = active_resource.send(param(workitem, :method), args)
195
+
196
+ # we got our response, but what to do with it?
197
+ if (h = param(workitem, :response_handling)).is_a?(Proc)
198
+ h.call(response, workitem)
199
+ end
200
+
201
+ # reply to the engine
202
+ reply_to_engine(workitem)
203
+ end
204
+
205
+ protected
206
+
207
+ def param (workitem, key)
208
+ workitem.params[key] || @options[key]
209
+ end
210
+ end
211
+
212
+ end
213
+ end
@@ -1,749 +1,3 @@
1
- #
2
- #--
3
- # Copyright (c) 2007-2008, John Mettraux, Tomaso Tosolini 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
1
 
34
- #
35
- # "made in Japan"
36
- #
37
- # John Mettraux at openwfe.org
38
- # Tomaso Tosolini
39
- #
40
-
41
- #require 'rubygems'
42
-
43
- #require_gem 'activerecord'
44
- gem 'activerecord'; require 'active_record'
45
-
46
-
47
- require 'openwfe/workitem'
48
- require 'openwfe/flowexpressionid'
49
- require 'openwfe/engine/engine'
50
- require 'openwfe/participants/participant'
51
-
52
-
53
- module OpenWFE
54
- module Extras
55
-
56
- #MUTEX = Mutex.new
57
-
58
- #
59
- # The migration for ActiveParticipant and associated classes.
60
- #
61
- # There are two tables 'workitems' and 'fields'. As its name implies,
62
- # the latter table stores the fields (also called attributes in OpenWFE
63
- # speak) of the workitems.
64
- #
65
- # See Workitem and Field for more details.
66
- #
67
- # For centralization purposes, the migration and the model are located
68
- # in the same source file. It should be quite easy for the Rails hackers
69
- # among you to sort that out for a Rails based usage.
70
- #
71
- class WorkitemTables < ActiveRecord::Migration
72
-
73
- def self.up
74
-
75
- create_table :workitems do |t|
76
- t.column :fei, :string
77
- t.column :wfid, :string
78
- t.column :wf_name, :string
79
- t.column :wf_revision, :string
80
- t.column :participant_name, :string
81
- t.column :store_name, :string
82
- t.column :dispatch_time, :timestamp
83
- t.column :last_modified, :timestamp
84
-
85
- t.column :yattributes, :text
86
- # when using compact_workitems, attributes are stored here
87
- end
88
- add_index :workitems, :fei, :unique => true
89
- # with sqlite3, comment out this :unique => true on :fei :(
90
- add_index :workitems, :wfid
91
- add_index :workitems, :wf_name
92
- add_index :workitems, :wf_revision
93
- add_index :workitems, :participant_name
94
- add_index :workitems, :store_name
95
-
96
- create_table :fields do |t|
97
- t.column :fkey, :string, :null => false
98
- t.column :vclass, :string, :null => false
99
- t.column :svalue, :string
100
- t.column :yvalue, :text
101
- t.column :workitem_id, :integer, :null => false
102
- end
103
- add_index :fields, [ :workitem_id, :fkey ], :unique => true
104
- add_index :fields, :fkey
105
- add_index :fields, :vclass
106
- add_index :fields, :svalue
107
- end
108
-
109
- def self.down
110
-
111
- drop_table :workitems
112
- drop_table :fields
113
- end
114
- end
115
-
116
- #
117
- # Reopening InFlowWorkItem to add a 'db_id' attribute.
118
- #
119
- class OpenWFE::InFlowWorkItem
120
-
121
- attr_accessor :db_id
122
- end
123
-
124
- #
125
- # The ActiveRecord version of an OpenWFEru workitem (InFlowWorkItem).
126
- #
127
- # One can very easily build a worklist based on a participant name via :
128
- #
129
- # wl = OpenWFE::Extras::Workitem.find_all_by_participant_name("toto")
130
- # puts "found #{wl.size} workitems for participant 'toto'"
131
- #
132
- # These workitems are not OpenWFEru workitems directly. But the conversion
133
- # is pretty easy.
134
- # Note that you probaly won't need to do the conversion by yourself,
135
- # except for certain advanced scenarii.
136
- #
137
- # awi = OpenWFE::Extras::Workitem.find_by_participant_name("toto")
138
- # #
139
- # # returns the first workitem in the database whose participant
140
- # # name is 'toto'.
141
- #
142
- # owi = awi.as_owfe_workitem
143
- # #
144
- # # Now we have a copy of the reference as a OpenWFEru
145
- # # InFlowWorkItem instance.
146
- #
147
- # awi = OpenWFE::Extras::Workitem.from_owfe_workitem(owi)
148
- # #
149
- # # turns an OpenWFEru InFlowWorkItem instance into an
150
- # # 'active workitem'.
151
- #
152
- class Workitem < ActiveRecord::Base
153
-
154
- has_many :fields, :dependent => :destroy
155
-
156
- serialize :yattributes
157
-
158
-
159
- #
160
- # Returns the flow expression id of this work (its unique OpenWFEru
161
- # identifier) as a FlowExpressionId instance.
162
- # (within the Workitem it's just stored as a String).
163
- #
164
- def full_fei
165
-
166
- OpenWFE::FlowExpressionId.from_s(fei)
167
- end
168
-
169
- #
170
- # Making sure last_modified is set to Time.now before each save.
171
- #
172
- def before_save
173
-
174
- touch
175
- end
176
-
177
- #
178
- # Generates a (new) Workitem from an OpenWFEru InFlowWorkItem instance.
179
- #
180
- # This is a 'static' method :
181
- #
182
- # awi = OpenWFE::Extras::Workitem.from_owfe_workitem(wi)
183
- #
184
- # (This method saves the 'ActiveWorkitem').
185
- #
186
- def Workitem.from_owfe_workitem (wi, store_name=nil)
187
-
188
- i = Workitem.new
189
- i.fei = wi.fei.to_s
190
- i.wfid = wi.fei.wfid
191
- i.wf_name = wi.fei.workflow_definition_name
192
- i.wf_revision = wi.fei.workflow_definition_revision
193
- i.participant_name = wi.participant_name
194
- i.dispatch_time = wi.dispatch_time
195
- i.last_modified = nil
196
-
197
- i.store_name = store_name
198
-
199
- i.save!
200
- # save workitem before adding any field
201
- # making sure it has an id...
202
-
203
- i = Workitem.find_by_fei(wi.fei.to_s) if i.id == 0
204
- # sometimes, the saved workitem id wasn't updated, was remaining at 0
205
- # thus finding if necessary...
206
-
207
- #i.fields.delete_all
208
- # why do I need that ??? fields were getting recycled...
209
-
210
- # This is a field set by the active participant immediately
211
- # before calling this method.
212
- # the default behavior is "use field method"
213
-
214
- if wi.attributes["compact_workitems"]
215
-
216
- wi.attributes.delete("compact_workitems")
217
- i.yattributes = wi.attributes
218
-
219
- else
220
-
221
- i.yattributes = nil
222
-
223
- wi.attributes.each do |k, v|
224
- i.fields << Field.new_field(k, v)
225
- end
226
- end
227
-
228
- i.save!
229
- # making sure to throw an exception in case of trouble
230
- #
231
- # damn, insert then update :(
232
-
233
- i
234
- end
235
-
236
- #
237
- # Turns the densha Workitem into an OpenWFEru InFlowWorkItem.
238
- #
239
- def as_owfe_workitem
240
-
241
- wi = OpenWFE::InFlowWorkItem.new
242
-
243
- wi.fei = full_fei
244
- wi.participant_name = participant_name
245
- wi.attributes = fields_hash
246
-
247
- wi.dispatch_time = dispatch_time
248
- wi.last_modified = last_modified
249
-
250
- wi.db_id = self.id
251
-
252
- wi
253
- end
254
-
255
- #
256
- # Returns a hash version of the 'fields' of this workitem.
257
- #
258
- # (Each time this method is called, it returns a new hash).
259
- #
260
- def fields_hash
261
-
262
- return self.yattributes if self.yattributes
263
-
264
- fields.inject({}) do |r, f|
265
- r[f.fkey] = f.value
266
- r
267
- end
268
- end
269
-
270
- #
271
- # Replaces the current fields of this workitem with the given hash.
272
- #
273
- # This method modifies the content of the db.
274
- #
275
- def replace_fields (fhash)
276
-
277
- if self.yattributes
278
-
279
- self.yattributes = fhash
280
-
281
- else
282
-
283
- fields.delete_all
284
-
285
- fhash.each do |k, v|
286
- fields << Field.new_field(k, v)
287
- end
288
- end
289
-
290
- #f = Field.new_field("___map_type", "smap")
291
- #
292
- # an old trick for backward compatibility with OpenWFEja
293
-
294
- save!
295
- # making sure to throw an exception in case of trouble
296
- end
297
-
298
- #
299
- # Returns the Field instance with the given key. This method accept
300
- # symbols as well as strings as its parameter.
301
- #
302
- # wi.field("customer_name")
303
- # wi.field :customer_name
304
- #
305
- def field (key)
306
-
307
- if self.yattributes
308
- return self.yattributes[key.to_s]
309
- end
310
-
311
- fields.find_by_fkey key.to_s
312
- end
313
-
314
- #
315
- # A shortcut method, replies to the workflow engine and removes self
316
- # from the database.
317
- # Handy for people who don't want to play with an ActiveParticipant
318
- # instance when just consuming workitems (that an active participant
319
- # pushed in the database).
320
- #
321
- def reply (engine)
322
-
323
- engine.reply self.as_owfe_workitem
324
- self.destroy
325
- end
326
-
327
- alias :forward :reply
328
- alias :proceed :reply
329
-
330
- #
331
- # Simply sets the 'last_modified' field to now.
332
- # (Doesn't save the workitem though).
333
- #
334
- def touch
335
-
336
- self.last_modified = Time.now
337
- end
338
-
339
- #
340
- # Opening engine to update its reply method to accept these
341
- # active record workitems.
342
- #
343
- class OpenWFE::Engine
344
-
345
- alias :oldreply :reply
346
-
347
- def reply (workitem)
348
-
349
- if workitem.is_a?(Workitem)
350
-
351
- oldreply(workitem.as_owfe_workitem)
352
- workitem.destroy
353
- else
354
-
355
- oldreply(workitem)
356
- end
357
- end
358
-
359
- alias :forward :reply
360
- alias :proceed :reply
361
- end
362
-
363
- #
364
- # Returns all the workitems belonging to the stores listed
365
- # in the parameter storename_list.
366
- # The result is a Hash whose keys are the store names and whose
367
- # values are list of workitems.
368
- #
369
- def self.find_in_stores (storename_list)
370
-
371
- workitems = find_all_by_store_name(storename_list)
372
-
373
- result = {}
374
-
375
- workitems.each do |wi|
376
- (result[wi.store_name] ||= []) << wi
377
- end
378
-
379
- result
380
- end
381
-
382
- #
383
- # A kind of 'google search' among workitems
384
- #
385
- # == Note
386
- #
387
- # when this is used on compact_workitems, it will not be able to search
388
- # info within the fields, because they aren't used by this kind of
389
- # workitems. In this case the search will be limited to participant_name
390
- #
391
- def self.search (search_string, storename_list=nil)
392
-
393
- #t = OpenWFE::Timer.new
394
-
395
- storename_list = Array(storename_list) if storename_list
396
-
397
- # participant_name
398
-
399
- result = find(
400
- :all,
401
- :conditions => conditions(
402
- "participant_name", search_string, storename_list),
403
- :order => "participant_name")
404
- # :limit => 10)
405
-
406
- ids = result.collect { |wi| wi.id }
407
-
408
- # search in fields
409
-
410
- fields = Field.search search_string, storename_list
411
- merge_search_results ids, result, fields
412
-
413
- #puts "... took #{t.duration} ms"
414
-
415
- # over.
416
-
417
- result
418
- end
419
-
420
- #
421
- # Not really about 'just launched', but rather about finding the first
422
- # workitem for a given process instance (wfid) and a participant.
423
- # It deserves its own method because the workitem could be in a
424
- # subprocess, thus escaping the vanilla find_by_wfid_and_participant()
425
- #
426
- def self.find_just_launched (wfid, participant_name)
427
-
428
- find(
429
- :first,
430
- :conditions => [
431
- "wfid LIKE ? AND participant_name = ?",
432
- "#{wfid}%",
433
- participant_name ])
434
- end
435
-
436
- protected
437
-
438
- #
439
- # builds the condition (the WHERE clause) for the
440
- # search.
441
- #
442
- def self.conditions (keyname, search_string, storename_list)
443
-
444
- cs = [ "#{keyname} LIKE ?", search_string ]
445
-
446
- if storename_list
447
-
448
- cs[0] = "#{cs[0]} AND workitems.store_name IN (?)"
449
- cs << storename_list
450
- end
451
-
452
- cs
453
- end
454
-
455
- def self.merge_search_results (ids, wis, new_wis)
456
-
457
- return if new_wis.size < 1
458
-
459
- new_wis.each do |wi|
460
- wi = wi.workitem if wi.kind_of?(Field)
461
- next if ids.include? wi.id
462
- ids << wi.id
463
- wis << wi
464
- end
465
- end
466
- end
467
-
468
- #
469
- # A workaround is in place for some classes when then have to get
470
- # serialized. The names of thoses classes are listed in this array.
471
- #
472
- SPECIAL_FIELD_CLASSES = [ 'Time', 'Date', 'DateTime' ]
473
-
474
- #
475
- # A Field (Attribute) of a Workitem.
476
- #
477
- class Field < ActiveRecord::Base
478
-
479
- belongs_to :workitem
480
- serialize :yvalue
481
-
482
- #
483
- # A quick method for doing
484
- #
485
- # f = Field.new
486
- # f.key = key
487
- # f.value = value
488
- #
489
- # One can then quickly add fields to an [active] workitem via :
490
- #
491
- # wi.fields << Field.new_field("toto", "b")
492
- #
493
- # This method does not save the new Field.
494
- #
495
- def self.new_field (key, value)
496
-
497
- f = Field.new
498
- f.fkey = key
499
- f.vclass = value.class.to_s
500
- f.value = value
501
- f
502
- end
503
-
504
- def value= (v)
505
-
506
- limit = connection.native_database_types[:string][:limit]
507
-
508
- if v.is_a?(String) and v.length <= limit
509
-
510
- self.svalue = v
511
-
512
- elsif SPECIAL_FIELD_CLASSES.include?(v.class.to_s)
513
-
514
- self.svalue = v.to_yaml
515
-
516
- else
517
-
518
- self.yvalue = v
519
- end
520
- end
521
-
522
- def value
523
-
524
- return YAML.load(self.svalue) \
525
- if SPECIAL_FIELD_CLASSES.include?(self.vclass)
526
-
527
- self.svalue || self.yvalue
528
- end
529
-
530
- #
531
- # Will return all the fields that contain the given text.
532
- #
533
- # Looks in svalue and fkey. Looks as well in yvalue if it contains
534
- # a string.
535
- #
536
- # This method is used by Workitem.search()
537
- #
538
- def self.search (text, storename_list=nil)
539
-
540
- cs = build_search_conditions(text)
541
-
542
- if storename_list
543
-
544
- cs[0] = "(#{cs[0]}) AND workitems.store_name IN (?)"
545
- cs << storename_list
546
- end
547
-
548
- find :all, :conditions => cs, :include => :workitem
549
- end
550
-
551
- protected
552
-
553
- #
554
- # The search operates on the content of these columns
555
- #
556
- FIELDS_TO_SEARCH = %w{ svalue fkey yvalue }
557
-
558
- #
559
- # Builds the condition array for a pseudo text search
560
- #
561
- def self.build_search_conditions (text)
562
-
563
- has_percent = (text.index("%") != nil)
564
-
565
- conds = []
566
-
567
- conds << FIELDS_TO_SEARCH.collect { |key|
568
-
569
- count = has_percent ? 1 : 4
570
-
571
- s = ([ "#{key} LIKE ?" ] * count).join(" OR ")
572
-
573
- s = "(vclass = ? AND (#{s}))" if key == 'yvalue'
574
-
575
- s
576
- }.join(" OR ")
577
-
578
- FIELDS_TO_SEARCH.each do |key|
579
-
580
- conds << 'String' if key == 'yvalue'
581
-
582
- conds << text
583
-
584
- unless has_percent
585
- conds << "% #{text} %"
586
- conds << "% #{text}"
587
- conds << "#{text} %"
588
- end
589
- end
590
-
591
- conds
592
- end
593
- end
594
-
595
-
596
- #
597
- # A basic 'ActiveParticipant'.
598
- # A store participant whose store is a set of ActiveRecord tables.
599
- #
600
- # Sample usage :
601
- #
602
- # class MyDefinition < OpenWFE::ProcessDefinition
603
- # sequence do
604
- # active0
605
- # active1
606
- # end
607
- # end
608
- #
609
- # def play_with_the_engine
610
- #
611
- # engine = OpenWFE::Engine.new
612
- #
613
- # engine.register_participant(
614
- # :active0, OpenWFE::Extras::ActiveParticipant)
615
- # engine.register_participant(
616
- # :active1, OpenWFE::Extras::ActiveParticipant)
617
- #
618
- # li = OpenWFE::LaunchItem.new(MyDefinition)
619
- # li.customer_name = 'toto'
620
- # engine.launch li
621
- #
622
- # sleep 0.500
623
- # # give some slack to the engine, it's asynchronous after all
624
- #
625
- # wi = OpenWFE::Extras::Workitem.find_by_participant_name("active0")
626
- #
627
- # # ...
628
- # end
629
- #
630
- # == Compact workitems
631
- #
632
- # It is possible to save all the workitem data into a single table,
633
- # the workitems table, without
634
- # splitting info between workitems and fields tables.
635
- #
636
- # You can configure the "compact_workitems" behavior by adding to the
637
- # previous lines:
638
- #
639
- # active0 = engine.register_participant(
640
- # :active0, OpenWFE::Extras::ActiveParticipant)
641
- #
642
- # active0.compact_workitems = true
643
- #
644
- # This behaviour is determined participant per participant, it's ok to
645
- # have a participant instance that compacts will there is another that
646
- # doesn't compact.
647
- #
648
- class ActiveParticipant
649
- include OpenWFE::LocalParticipant
650
-
651
- #
652
- # when compact_workitems is set to true, the attributes of a workitem
653
- # are stored in the yattributes column (they are not expanded into
654
- # the Fields table).
655
- # By default, workitem attributes are expanded.
656
- #
657
- attr :compact_workitems, true
658
-
659
- #
660
- # This is the method called by the OpenWFEru engine to hand a
661
- # workitem to this participant.
662
- #
663
- def consume (workitem)
664
-
665
- if compact_workitems
666
- workitem.attributes["compact_workitems"] = true
667
- end
668
-
669
- Workitem.from_owfe_workitem workitem
670
- end
671
-
672
- #
673
- # Called by the engine when the whole process instance (or just the
674
- # segment of it that sports this participant) is cancelled.
675
- # Will removed the workitem with the same fei as the cancelitem
676
- # from the database.
677
- #
678
- # No expression will be raised if there is no corresponding workitem.
679
- #
680
- def cancel (cancelitem)
681
-
682
- Workitem.destroy_all([ "fei = ?", cancelitem.fei.to_s ])
683
- # note that delete_all was not removing workitem fields
684
- end
685
-
686
- #
687
- # When the activity/work/operation whatever is over and the flow
688
- # should resume, this is the method to use to hand back the [modified]
689
- # workitem to the [local] engine.
690
- #
691
- def reply_to_engine (workitem)
692
-
693
- super workitem.as_owfe_workitem
694
- #
695
- # replies to the workflow engine
696
-
697
- workitem.destroy
698
- #
699
- # removes the workitem from the database
700
- end
701
- end
702
-
703
- #
704
- # An extension of ActiveParticipant. It has a 'store_name' and it
705
- # makes sure to flag every workitem it 'consumes' with that name
706
- # (in its 'store_name' column/field).
707
- #
708
- # This is the participant used mainly in 'densha' for human users.
709
- #
710
- class ActiveStoreParticipant < ActiveParticipant
711
- include Enumerable
712
-
713
- def initialize (store_name)
714
-
715
- super()
716
- @store_name = store_name
717
- end
718
-
719
- #
720
- # This is the method called by the OpenWFEru engine to hand a
721
- # workitem to this participant.
722
- #
723
- def consume (workitem)
724
-
725
- if compact_workitems
726
- workitem.attributes["compact_workitems"] = true
727
- end
728
-
729
- Workitem.from_owfe_workitem(workitem, @store_name)
730
- end
731
-
732
- #
733
- # Iterates over the workitems currently in this store.
734
- #
735
- def each (&block)
736
-
737
- return unless block
738
-
739
- wis = Workitem.find_by_store_name @store_name
740
-
741
- wis.each do |wi|
742
- block.call wi
743
- end
744
- end
745
- end
746
-
747
- end
748
- end
2
+ require File.dirname(__FILE__) + '/active_participants'
749
3