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,139 @@
1
+ #
2
+ #--
3
+ # Copyright (c) 2007-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
+ # "made in Japan"
36
+ #
37
+ # John Mettraux at openwfe.org
38
+ #
39
+
40
+ require 'find'
41
+ require 'yaml'
42
+ require 'fileutils'
43
+
44
+ require 'rufus/scheduler'
45
+
46
+ require 'openwfe/service'
47
+ require 'openwfe/rudefinitions'
48
+ require 'openwfe/listeners/listener'
49
+
50
+
51
+ #
52
+ # some base listener implementations
53
+ #
54
+ module OpenWFE
55
+
56
+ #
57
+ # Polls a directory for incoming workitems (as files).
58
+ #
59
+ # Workitems can be instances of InFlowWorkItem or LaunchItem.
60
+ #
61
+ # require 'openwfe/listeners/listeners'
62
+ #
63
+ # engine.add_workitem_listener(OpenWFE::FileListener, "500")
64
+ #
65
+ # In this example, the directory ./work/in/ will be polled every 500
66
+ # milliseconds for incoming workitems (or launchitems).
67
+ #
68
+ # You can override the load_object(path) method to manage other formats
69
+ # then YAML.
70
+ #
71
+ class FileListener < Service
72
+ include WorkItemListener
73
+ include Rufus::Schedulable
74
+
75
+ attr_reader :workdir
76
+
77
+ def initialize (service_name, application_context)
78
+
79
+ super
80
+
81
+ @workdir = get_work_directory + "/in/"
82
+
83
+ linfo { "new() workdir is '#{@workdir}'" }
84
+ end
85
+
86
+ #
87
+ # Will 'find' files in the work directory (by default ./work/in/),
88
+ # extract the workitem in them and feed it back to the engine.
89
+ #
90
+ def trigger (params)
91
+ # no synchronization for now
92
+
93
+ ldebug { "trigger()" }
94
+
95
+ FileUtils.makedirs(@workdir) unless File.exist?(@workdir)
96
+
97
+ Find.find(@workdir) do |path|
98
+
99
+ next if File.stat(path).directory?
100
+
101
+ ldebug { "trigger() considering file '#{path}'" }
102
+
103
+ begin
104
+
105
+ object = load_object(path)
106
+
107
+ handle_item(object) if object
108
+
109
+ rescue Exception => e
110
+
111
+ linfo do
112
+ "trigger() failure while loading from '#{path}'. " +
113
+ "Resuming... \n" +
114
+ OpenWFE::exception_to_s(e)
115
+ end
116
+ end
117
+ end
118
+ end
119
+
120
+ protected
121
+
122
+ #
123
+ # Turns a file into a Ruby instance.
124
+ # This base implementation does it via YAML.
125
+ #
126
+ def load_object (path)
127
+
128
+ return nil unless path.match ".*\.yaml$"
129
+
130
+ object = YAML.load_file path
131
+
132
+ File.delete path
133
+
134
+ object
135
+ end
136
+ end
137
+
138
+ end
139
+
@@ -0,0 +1,272 @@
1
+ #
2
+ #--
3
+ # Copyright (c) 2007-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
+ # "made in Japan"
36
+ #
37
+ # John Mettraux at openwfe.org
38
+ #
39
+
40
+ require 'yaml'
41
+ require 'socket'
42
+
43
+ require 'openwfe/utils'
44
+ require 'openwfe/service'
45
+ require 'openwfe/workitem'
46
+ require 'openwfe/rudefinitions'
47
+ require 'openwfe/orest/xmlcodec'
48
+ require 'openwfe/listeners/listener'
49
+
50
+
51
+ #
52
+ # some base listener implementations
53
+ #
54
+ module OpenWFE
55
+
56
+ #
57
+ # Listens for workitems on a socket.
58
+ #
59
+ # Workitems can be instances of InFlowWorkItem or LaunchItem.
60
+ #
61
+ # By default, listens on port 7007.
62
+ #
63
+ # require 'openwfe/listeners/socketlisteners'
64
+ #
65
+ # engine.add_workitem_listener(OpenWFE::SocketListener)
66
+ #
67
+ # But you can be more specific :
68
+ #
69
+ # engine.add_workitem_listener(
70
+ # OpenWFE::SocketListener.new(
71
+ # "sl_whatever_name",
72
+ # engine.application_context,
73
+ # "target.host.xx",
74
+ # 7707)
75
+ #
76
+ class SocketListener < Service
77
+ include WorkItemListener
78
+
79
+ attr_reader :server, :thread
80
+
81
+ def initialize (service_name, application_context, port=nil, iface=nil)
82
+
83
+ super(service_name, application_context)
84
+
85
+ #iface ||= "127.0.0.1"
86
+ # not necessary
87
+
88
+ port ||= 7007
89
+
90
+ @server = TCPServer.new(iface, port)
91
+
92
+ @thread = OpenWFE.call_in_thread(@service_name, self) do
93
+ listen
94
+ end
95
+ end
96
+
97
+ #
98
+ # Stops this socket listener (shuts down its socket)
99
+ #
100
+ def stop
101
+
102
+ @thread.raise "shutdown"
103
+
104
+ begin
105
+ @server.close
106
+ rescue Exception => e
107
+ ldebug { "stop() exc : #{e.to_s}" }
108
+ end
109
+ #begin
110
+ # @server.shutdown
111
+ #rescue Exception => e
112
+ # ldebug { "stop() exc : #{e.to_s}" }
113
+ #end
114
+
115
+ linfo { "stop() shut socket down" }
116
+ end
117
+
118
+ #
119
+ # This base implementation is capable of decoding XML workitems
120
+ # and YAML workitems.
121
+ #
122
+ def decode_workitem (data)
123
+
124
+ return nil if not data or data.length < 4
125
+
126
+ if data[0, 1] == "<"
127
+ #
128
+ # seems like XML
129
+
130
+ OpenWFE::XmlCodec::decode(data)
131
+
132
+ elsif data[0, 3] == "---"
133
+ #
134
+ # must be YAML
135
+
136
+ YAML.load(data)
137
+
138
+ else
139
+ #
140
+ # perhaps OpenWFEja style header + workitem
141
+
142
+ data = pop_line(data)
143
+ data = pop_line(data)
144
+
145
+ decode_workitem(data)
146
+ end
147
+ end
148
+
149
+ #
150
+ # Simply pipes back the result of get_engine.reply(wi) on the
151
+ # socket.
152
+ #
153
+ def reply_to_socket (socket, result)
154
+
155
+ socket.puts result.to_s
156
+ socket.puts
157
+ socket.close_write
158
+
159
+ #ldebug { "reply_to_socket() result is >#{result}<" }
160
+ end
161
+
162
+ #
163
+ # The base implementation allows returns true.
164
+ #
165
+ # An override of this method might check the origin of the socket
166
+ # and maybe only allow a certain range of hosts...
167
+ #
168
+ def is_allowed? (socket)
169
+
170
+ true
171
+ end
172
+
173
+ protected
174
+
175
+ #
176
+ # Where the socket waiting loop is...
177
+ #
178
+ def listen
179
+
180
+ linfo { "listen() listening on #{@server.addr.join(' ')}" }
181
+
182
+ loop do
183
+
184
+ socket = nil
185
+
186
+ begin
187
+ socket = @server.accept
188
+ rescue Exception => e
189
+ linfo { "listen() shut down '#{e}'" }
190
+ end
191
+
192
+ return unless socket
193
+
194
+ OpenWFE.call_in_thread(@service_name, self) do
195
+ handle_socket(socket) if socket and is_allowed?(socket)
196
+ end
197
+ end
198
+ end
199
+
200
+ #
201
+ # The bulk work of handling a connection is done here. The
202
+ # incoming workitem is piped to the engine, then the result
203
+ # it written back a string on the socket which then gets closed.
204
+ #
205
+ def handle_socket (socket)
206
+
207
+ ldebug do
208
+ "handle_socket() "+
209
+ "connection from #{socket.peeraddr.join(' ')}"
210
+ end
211
+
212
+ data = ""
213
+ loop do
214
+ s = socket.gets
215
+ break unless s
216
+ data += s
217
+ end
218
+
219
+ wi = decode_workitem(data)
220
+
221
+ if not wi
222
+
223
+ ldebug do
224
+ "handle_socket() "+
225
+ ">>>#{data}<<< doesn't contain a workitem"
226
+ end
227
+ socket.close
228
+ return
229
+
230
+ else
231
+
232
+ ldebug do
233
+ "handle_socket() "+
234
+ "received something of class #{wi.class}"
235
+ end
236
+ end
237
+
238
+ result = nil
239
+
240
+ begin
241
+
242
+ #result = get_engine.reply(wi)
243
+ #result = handle_item(wi)
244
+ handle_item wi
245
+
246
+ result = "<ok-reply/>"
247
+
248
+ ldebug { "handle_socket() result is >>#{result}<<" }
249
+
250
+ rescue Exception => e
251
+
252
+ result = "ERROR\n\n"
253
+ result << OpenWFE::exception_to_s(e)
254
+
255
+ ldebug { "handle_socket() error reply :\n" + result }
256
+ end
257
+
258
+ reply_to_socket(socket, result)
259
+
260
+ socket.close
261
+ end
262
+
263
+ def pop_line (s)
264
+
265
+ i = s.index("\n")
266
+ return s unless i
267
+ s[i+1..-1]
268
+ end
269
+ end
270
+
271
+ end
272
+
@@ -0,0 +1,122 @@
1
+ #
2
+ #--
3
+ # Copyright (c) 2006-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
+ # "made in Japan"
36
+ #
37
+ # John Mettraux at openwfe.org
38
+ #
39
+
40
+ require 'logger'
41
+ require 'openwfe/utils'
42
+
43
+
44
+ module OpenWFE
45
+
46
+ #
47
+ # A Mixin for adding logging method to any class
48
+ #
49
+ module Logging
50
+
51
+ def ldebug (message=nil, &block)
52
+ do_log(:debug, message, &block)
53
+ end
54
+
55
+ def linfo (message=nil, &block)
56
+ do_log(:info, message, &block)
57
+ end
58
+
59
+ def lwarn (message=nil, &block)
60
+ do_log(:warn, message, &block)
61
+ end
62
+
63
+ def lerror (message=nil, &block)
64
+ do_log(:error, message, &block)
65
+ end
66
+
67
+ def lfatal (message=nil, &block)
68
+ do_log(:fatal, message, &block)
69
+ end
70
+
71
+ def lunknown (message=nil, &block)
72
+ do_log(:unknown, message, &block)
73
+ end
74
+
75
+ def llog (level, message=nil, &block)
76
+ do_log(level, message, &block)
77
+ end
78
+
79
+ #
80
+ # A simplification of caller_to_s for direct usage when debugging
81
+ #
82
+ def ldebug_callstack (msg, max_lines=nil)
83
+
84
+ ldebug { "#{msg}\n" + OpenWFE::caller_to_s(9, max_lines) }
85
+ end
86
+
87
+ private
88
+
89
+ def do_log (level, message, &block)
90
+
91
+ return unless $OWFE_LOG
92
+
93
+ logblock = lambda do
94
+ if block
95
+ "#{log_prepare(message)} - #{block.call}"
96
+ else
97
+ "#{log_prepare(message)}"
98
+ end
99
+ end
100
+
101
+ $OWFE_LOG.send level, &logblock
102
+ end
103
+
104
+ def log_prepare (message)
105
+
106
+ return log_author() unless message
107
+ "#{log_author} - #{message}"
108
+ end
109
+
110
+ def log_author
111
+
112
+ if respond_to?(:service_name)
113
+ "#{self.class} '#{self.service_name}'"
114
+ else
115
+ "#{self.class}"
116
+ end
117
+ end
118
+
119
+ end
120
+
121
+ end
122
+