ruote 0.9.18 → 0.9.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.txt +2 -0
- data/examples/about_state.rb +29 -29
- data/examples/bigflow.rb +9 -9
- data/examples/csv_weather.rb +4 -4
- data/examples/engine_template.rb +141 -129
- data/examples/flowtracing.rb +8 -8
- data/examples/homeworkreview.rb +15 -15
- data/examples/kotoba.rb +9 -9
- data/examples/mano_tracker.rb +63 -63
- data/examples/openwferu.rb +22 -20
- data/examples/quotereporter.rb +79 -79
- data/lib/openwfe/contextual.rb +72 -72
- data/lib/openwfe/def.rb +21 -21
- data/lib/openwfe/engine.rb +19 -19
- data/lib/openwfe/engine/engine.rb +578 -614
- data/lib/openwfe/engine/expool_methods.rb +144 -115
- data/lib/openwfe/engine/file_persisted_engine.rb +77 -77
- data/lib/openwfe/engine/participant_methods.rb +96 -96
- data/lib/openwfe/engine/status_methods.rb +271 -247
- data/lib/openwfe/engine/update_exp_methods.rb +69 -69
- data/lib/openwfe/exceptions.rb +25 -25
- data/lib/openwfe/expool/errorjournal.rb +334 -348
- data/lib/openwfe/expool/expool_pause_methods.rb +98 -0
- data/lib/openwfe/expool/expressionpool.rb +793 -800
- data/lib/openwfe/expool/expstorage.rb +284 -313
- data/lib/openwfe/expool/history.rb +193 -105
- data/lib/openwfe/expool/journal.rb +163 -163
- data/lib/openwfe/expool/journal_replay.rb +228 -228
- data/lib/openwfe/expool/parser.rb +178 -142
- data/lib/openwfe/{orest/exception.rb → expool/paused_error.rb} +49 -32
- data/lib/openwfe/expool/representation.rb +59 -59
- data/lib/openwfe/expool/threadedexpstorage.rb +137 -134
- data/lib/openwfe/expool/wfidgen.rb +289 -287
- data/lib/openwfe/expool/yamlexpstorage.rb +154 -154
- data/lib/openwfe/expressions/condition.rb +175 -168
- data/lib/openwfe/expressions/environment.rb +165 -165
- data/lib/openwfe/expressions/expressionmap.rb +135 -131
- data/lib/openwfe/expressions/fe_cancel.rb +68 -68
- data/lib/openwfe/expressions/fe_command.rb +190 -190
- data/lib/openwfe/expressions/fe_concurrence.rb +531 -531
- data/lib/openwfe/expressions/fe_cron.rb +152 -197
- data/lib/openwfe/expressions/fe_cursor.rb +152 -186
- data/lib/openwfe/expressions/fe_define.rb +118 -118
- data/lib/openwfe/expressions/fe_do.rb +109 -109
- data/lib/openwfe/expressions/fe_equals.rb +219 -219
- data/lib/openwfe/expressions/fe_filter.rb +98 -98
- data/lib/openwfe/expressions/fe_filter_definition.rb +122 -122
- data/lib/openwfe/expressions/fe_fqv.rb +203 -203
- data/lib/openwfe/expressions/fe_http.rb +212 -0
- data/lib/openwfe/expressions/fe_if.rb +214 -214
- data/lib/openwfe/expressions/fe_iterator.rb +91 -91
- data/lib/openwfe/expressions/fe_listen.rb +268 -268
- data/lib/openwfe/expressions/fe_losfor.rb +73 -73
- data/lib/openwfe/expressions/fe_misc.rb +343 -351
- data/lib/openwfe/expressions/fe_participant.rb +206 -206
- data/lib/openwfe/expressions/fe_reserve.rb +153 -142
- data/lib/openwfe/expressions/fe_save.rb +226 -226
- data/lib/openwfe/expressions/fe_sequence.rb +66 -56
- data/lib/openwfe/expressions/fe_set.rb +80 -80
- data/lib/openwfe/expressions/fe_sleep.rb +132 -125
- data/lib/openwfe/expressions/fe_step.rb +113 -111
- data/lib/openwfe/expressions/fe_subprocess.rb +139 -136
- data/lib/openwfe/expressions/fe_timeout.rb +74 -78
- data/lib/openwfe/expressions/fe_wait.rb +48 -49
- data/lib/openwfe/expressions/fe_when.rb +106 -106
- data/lib/openwfe/expressions/filter.rb +60 -60
- data/lib/openwfe/expressions/flowexpression.rb +618 -612
- data/lib/openwfe/expressions/iterator.rb +158 -158
- data/lib/openwfe/expressions/merge.rb +53 -53
- data/lib/openwfe/expressions/raw.rb +396 -397
- data/lib/openwfe/expressions/rprocdef.rb +261 -266
- data/lib/openwfe/expressions/time.rb +238 -243
- data/lib/openwfe/expressions/timeout.rb +135 -135
- data/lib/openwfe/expressions/value.rb +55 -55
- data/lib/openwfe/extras/engine/db_persisted_engine.rb +94 -0
- data/lib/openwfe/extras/expool/dberrorjournal.rb +189 -0
- data/lib/openwfe/extras/expool/dbexpstorage.rb +355 -0
- data/lib/openwfe/extras/expool/dbhistory.rb +135 -0
- data/lib/openwfe/extras/listeners/sqslisteners.rb +146 -0
- data/lib/openwfe/extras/misc/activityfeed.rb +264 -0
- data/lib/openwfe/extras/misc/basecamp.rb +485 -0
- data/lib/openwfe/extras/participants/activeparticipants.rb +749 -0
- data/lib/openwfe/extras/participants/atomfeed_participants.rb +173 -0
- data/lib/openwfe/extras/participants/atompub_participants.rb +267 -0
- data/lib/openwfe/extras/participants/basecamp_participants.rb +87 -0
- data/lib/openwfe/extras/participants/csvparticipants.rb +127 -0
- data/lib/openwfe/extras/participants/sqsparticipants.rb +125 -0
- data/lib/openwfe/extras/participants/twitterparticipants.rb +176 -0
- data/lib/openwfe/filterdef.rb +191 -191
- data/lib/openwfe/flowexpressionid.rb +271 -269
- data/lib/openwfe/listeners/listener.rb +61 -61
- data/lib/openwfe/listeners/listeners.rb +81 -81
- data/lib/openwfe/listeners/socketlisteners.rb +189 -189
- data/lib/openwfe/logging.rb +74 -74
- data/lib/openwfe/omixins.rb +55 -54
- data/lib/openwfe/orest/definitions.rb +90 -90
- data/lib/openwfe/orest/osocket.rb +91 -91
- data/lib/openwfe/orest/xmlcodec.rb +471 -459
- data/lib/openwfe/participants.rb +19 -19
- data/lib/openwfe/participants/enoparticipants.rb +187 -187
- data/lib/openwfe/participants/participant.rb +100 -100
- data/lib/openwfe/participants/participantmap.rb +170 -170
- data/lib/openwfe/participants/participants.rb +316 -316
- data/lib/openwfe/participants/soapparticipants.rb +90 -90
- data/lib/openwfe/participants/socketparticipants.rb +143 -143
- data/lib/openwfe/participants/storeparticipants.rb +198 -198
- data/lib/openwfe/rexml.rb +44 -0
- data/lib/openwfe/rudefinitions.rb +87 -91
- data/lib/openwfe/service.rb +65 -65
- data/lib/openwfe/storage/yamlcustom.rb +71 -71
- data/lib/openwfe/storage/yamlfilestorage.rb +190 -190
- data/lib/openwfe/tools/flowtracer.rb +41 -45
- data/lib/openwfe/util/dollar.rb +125 -139
- data/lib/openwfe/util/irb.rb +42 -42
- data/lib/openwfe/util/observable.rb +93 -99
- data/lib/openwfe/util/ometa.rb +36 -36
- data/lib/openwfe/util/treechecker.rb +122 -0
- data/lib/openwfe/util/workqueue.rb +73 -73
- data/lib/openwfe/util/xml.rb +285 -279
- data/lib/openwfe/utils.rb +415 -442
- data/lib/openwfe/version.rb +1 -1
- data/lib/openwfe/workitem.rb +444 -437
- data/lib/openwfe/worklist/oldrest.rb +161 -161
- data/lib/openwfe/worklist/storelocks.rb +218 -218
- data/lib/openwfe/worklist/storeparticipant.rb +19 -19
- data/lib/openwfe/worklist/worklist.rb +223 -223
- data/test/back_0916_test.rb +57 -59
- data/test/bm/bm_1_xml_vs_prog.rb +25 -22
- data/test/bm/bm_2_step.rb +81 -81
- data/test/bm/ft_0f_5ms.rb +13 -13
- data/test/bm/ft_26_load.rb +177 -179
- data/test/bm/ft_26b_load.rb +57 -59
- data/test/bm/ft_26c_load.rb +70 -65
- data/test/bm/ft_recu.rb +51 -51
- data/test/clone_test.rb +145 -99
- data/test/concurrence_test.rb +41 -41
- data/test/condition_test.rb +104 -90
- data/test/description_test.rb +46 -45
- data/test/eno_test.rb +36 -36
- data/test/expmap_test.rb +26 -26
- data/test/extras/README.txt +5 -0
- data/test/extras/active_connection.rb +48 -0
- data/test/extras/active_with_engine_test.rb +140 -0
- data/test/extras/activityfeed_test.rb +85 -0
- data/test/extras/ap_0_test.rb +287 -0
- data/test/extras/ap_1_test.rb +53 -0
- data/test/extras/ap_test_base.rb +24 -0
- data/test/extras/atomfeedp_test.rb +113 -0
- data/test/extras/atompubp_test.rb +91 -0
- data/test/extras/basecamp_test.rb +53 -0
- data/test/extras/db_errorjournal_utest.rb +75 -0
- data/test/extras/db_expstorage_utest.rb +171 -0
- data/test/extras/db_history_0_test.rb +58 -0
- data/test/extras/ft_19_csv.rb +58 -0
- data/test/extras/ft_71_b14008.rb +85 -0
- data/test/extras/sqs_test.rb +57 -0
- data/test/extras/twitter_test.rb +62 -0
- data/test/fe_lookup_att_test.rb +41 -41
- data/test/fei_test.rb +131 -131
- data/test/file_persisted_engine_test.rb +30 -30
- data/test/file_persistence_test.rb +112 -111
- data/test/filep_cancel_test.rb +58 -58
- data/test/filter_test.rb +67 -67
- data/test/flowtestbase.rb +207 -219
- data/test/ft_0.rb +35 -35
- data/test/ft_0b_sequence.rb +15 -15
- data/test/ft_0c_testname.rb +12 -12
- data/test/ft_0d_participant.rb +9 -9
- data/test/ft_0e_multibody.rb +11 -11
- data/test/ft_10_loop.rb +103 -104
- data/test/ft_11_ppd.rb +285 -289
- data/test/ft_11b_ppd.rb +26 -26
- data/test/ft_12_blockparticipant.rb +57 -57
- data/test/ft_13_eno.rb +31 -31
- data/test/ft_14_subprocess.rb +45 -45
- data/test/ft_14b_subprocess.rb +107 -107
- data/test/ft_14c_subprocess.rb +33 -33
- data/test/ft_15_iterator.rb +127 -127
- data/test/ft_15b_iterator.rb +41 -41
- data/test/ft_16_fqv.rb +44 -44
- data/test/ft_17_condition.rb +48 -48
- data/test/ft_18_pname.rb +26 -26
- data/test/ft_1_unset.rb +140 -140
- data/test/ft_1b_unset.rb +17 -17
- data/test/ft_20_cron.rb +33 -33
- data/test/ft_21_cron.rb +51 -51
- data/test/ft_21b_cron_pause.rb +41 -41
- data/test/ft_22_history.rb +45 -41
- data/test/ft_23_when.rb +51 -51
- data/test/ft_23b_when.rb +43 -43
- data/test/ft_23c_wait.rb +48 -48
- data/test/ft_23d_cww.rb +28 -28
- data/test/ft_24_def.rb +15 -15
- data/test/ft_25_cancel.rb +57 -54
- data/test/ft_27_getflowpos.rb +79 -83
- data/test/ft_28_fileparticipant.rb +25 -25
- data/test/ft_29_httprb.rb +57 -57
- data/test/ft_2_concurrence.rb +99 -97
- data/test/ft_2b_concurrence.rb +132 -132
- data/test/ft_2c_concurrence.rb +37 -37
- data/test/ft_30_socketlistener.rb +133 -133
- data/test/ft_31_flowname.rb +15 -16
- data/test/ft_32_journal.rb +48 -48
- data/test/ft_32c_journal.rb +54 -54
- data/test/ft_32d_journal.rb +43 -46
- data/test/ft_33_description.rb +62 -62
- data/test/ft_34_cancelwfid.rb +37 -37
- data/test/ft_35_localdefs.rb +36 -34
- data/test/ft_36_subprocids.rb +61 -61
- data/test/ft_37_pnames.rb +33 -33
- data/test/ft_38_tag.rb +82 -82
- data/test/ft_38b_tag.rb +97 -97
- data/test/ft_38c_tag.rb +50 -50
- data/test/ft_38d_tag.rb +53 -0
- data/test/ft_39_reserve.rb +33 -33
- data/test/ft_39b_reserve.rb +59 -59
- data/test/ft_3_equals.rb +131 -131
- data/test/ft_3b_lookup_vf.rb +43 -43
- data/test/ft_40_defined.rb +33 -33
- data/test/ft_41_case.rb +80 -80
- data/test/ft_42_environments.rb +48 -48
- data/test/ft_43_pat10.rb +51 -51
- data/test/ft_44_save.rb +37 -37
- data/test/ft_44b_restore.rb +151 -151
- data/test/ft_45_citerator.rb +149 -149
- data/test/ft_45b_citerator.rb +77 -0
- data/test/ft_46_pparams.rb +27 -27
- data/test/ft_47_filter.rb +100 -100
- data/test/ft_48_fe_filter.rb +41 -41
- data/test/ft_49_condition.rb +101 -94
- data/test/ft_4_misc.rb +185 -190
- data/test/ft_50_xml_attribute.rb +101 -104
- data/test/ft_51_stack.rb +30 -30
- data/test/ft_52_obs_participant.rb +73 -73
- data/test/ft_53_null_noop_participant.rb +31 -31
- data/test/ft_54_listen.rb +183 -183
- data/test/ft_54b_listen.rb +32 -32
- data/test/ft_54c_listen.rb +60 -60
- data/test/ft_55_ptimeout.rb +29 -30
- data/test/ft_56_timeout.rb +29 -29
- data/test/ft_57_a.rb +105 -102
- data/test/ft_58_ejournal.rb +83 -80
- data/test/ft_58b_ejournal.rb +82 -0
- data/test/ft_59_ps.rb +148 -86
- data/test/ft_5_time.rb +77 -77
- data/test/ft_60_ecancel.rb +98 -98
- data/test/ft_61_elsub.rb +23 -23
- data/test/ft_62_procparticipant.rb +46 -46
- data/test/ft_63_pause.rb +82 -69
- data/test/ft_64_alias.rb +56 -57
- data/test/ft_65_stringlaunch.rb +29 -29
- data/test/ft_66_subforget.rb +42 -42
- data/test/ft_67_schedlaunch.rb +58 -59
- data/test/ft_68_ifparticipant.rb +39 -39
- data/test/ft_69_cancelmissing.rb +23 -21
- data/test/ft_6_lambda.rb +37 -37
- data/test/ft_70_lookupvar.rb +25 -25
- data/test/ft_71_log.rb +35 -35
- data/test/ft_72_lookup_processes.rb +43 -40
- data/test/ft_73_cancel_sub.rb +79 -79
- data/test/ft_74_block_and_workitem_dup.rb +42 -42
- data/test/ft_75_ruby_attributes.rb +53 -51
- data/test/ft_76_merge_isolate.rb +57 -57
- data/test/ft_77_segments.rb +13 -13
- data/test/ft_78_eval.rb +94 -94
- data/test/ft_79_tticket.rb +79 -79
- data/test/ft_79b_tticket.rb +73 -73
- data/test/ft_79c_outcome.rb +36 -36
- data/test/ft_7_lose.rb +73 -73
- data/test/ft_7b_lose.rb +49 -49
- data/test/ft_80_spname.rb +65 -65
- data/test/ft_81_exp.rb +30 -30
- data/test/ft_82_trecu.rb +30 -24
- data/test/ft_83_badpause.rb +35 -35
- data/test/ft_84_updateexp.rb +118 -118
- data/test/ft_84b_subrepr.rb +72 -0
- data/test/ft_85_dolhash.rb +18 -18
- data/test/ft_86_dollar_fv.rb +33 -33
- data/test/ft_87_define.rb +47 -47
- data/test/ft_88_http.rb +100 -0
- data/test/ft_8_forget.rb +25 -25
- data/test/ft_9_cursor.rb +119 -110
- data/test/ft_9b_cursor.rb +70 -70
- data/test/ft_tests.rb +6 -0
- data/test/hash_test.rb +52 -34
- data/test/hparticipant_test.rb +92 -88
- data/test/lookup_att_test.rb +70 -70
- data/test/lookup_vf_test.rb +52 -52
- data/test/misc_test.rb +55 -51
- data/test/obs_test.rb +82 -82
- data/test/param_test.rb +181 -181
- data/test/participant_test.rb +46 -46
- data/test/pending.rb +12 -12
- data/test/ps_representation.rb +70 -70
- data/test/rake_ltest.rb +2 -2
- data/test/rake_qtest.rb +11 -11
- data/test/raw_prog_test.rb +303 -308
- data/test/restart_cron_test.rb +74 -74
- data/test/restart_paused_test.rb +52 -47
- data/test/restart_sleep_test.rb +80 -80
- data/test/restart_when_test.rb +64 -64
- data/test/ruby_procdef_test.rb +71 -71
- data/test/rutest_utils.rb +32 -32
- data/test/sec_test.rb +143 -142
- data/test/slock_test.rb +41 -41
- data/test/storage_test.rb +15 -15
- data/test/timeout_test.rb +53 -53
- data/test/treechecker_test.rb +111 -0
- data/test/util_xml_test.rb +57 -57
- data/test/wfid_test.rb +93 -93
- data/test/wi_test.rb +58 -58
- metadata +64 -19
- data/examples/scheduler_cron_usage.rb +0 -48
- data/examples/scheduler_usage.rb +0 -56
- data/lib/openwfe/orest/controlclient.rb +0 -119
- data/lib/openwfe/orest/oldrestservlet.rb +0 -279
- data/lib/openwfe/orest/restclient.rb +0 -176
- data/lib/openwfe/orest/workitem.rb +0 -206
- data/lib/openwfe/orest/worklistclient.rb +0 -272
- data/test/bm/ft_26d_load.rb +0 -97
- data/test/ft_59b_ps_for_pat.rb +0 -58
- data/test/ft_64_clone.rb +0 -69
- data/test/orest_test.rb +0 -251
@@ -2,31 +2,31 @@
|
|
2
2
|
#--
|
3
3
|
# Copyright (c) 2007-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
|
#
|
@@ -46,343 +46,345 @@ require 'openwfe/rudefinitions'
|
|
46
46
|
|
47
47
|
|
48
48
|
module OpenWFE
|
49
|
-
|
50
|
-
#
|
51
|
-
# This default wfid generator outputs a long integer as a String.
|
52
|
-
# The last given id (in order to prevent clocks being put back) is
|
53
|
-
# stored in the work directory in the file "wfidgen.last"
|
54
|
-
#
|
55
|
-
class DefaultWfidGenerator < Service
|
56
|
-
|
57
|
-
def initialize (service_name, application_context)
|
58
49
|
|
59
|
-
|
50
|
+
#
|
51
|
+
# This default wfid generator outputs a long integer as a String.
|
52
|
+
# The last given id (in order to prevent clocks being put back) is
|
53
|
+
# stored in the work directory in the file "wfidgen.last"
|
54
|
+
#
|
55
|
+
class DefaultWfidGenerator < Service
|
60
56
|
|
61
|
-
|
62
|
-
@mutex = Mutex.new
|
63
|
-
|
64
|
-
@last_fn = get_work_directory + '/wfidgen.last'
|
65
|
-
|
66
|
-
load_last()
|
67
|
-
|
68
|
-
ensure_last_f
|
69
|
-
end
|
70
|
-
|
71
|
-
#
|
72
|
-
# Returns a new workflow instance id
|
73
|
-
#
|
74
|
-
# The launchitem parameter is not used by this generator.
|
75
|
-
#
|
76
|
-
def generate (launchitem=nil)
|
57
|
+
def initialize (service_name, application_context)
|
77
58
|
|
78
|
-
|
59
|
+
super
|
79
60
|
|
80
|
-
|
81
|
-
|
82
|
-
wfid = @last + 1 if wfid <= @last
|
83
|
-
@last = wfid
|
84
|
-
save_last
|
85
|
-
end
|
61
|
+
@last = -1
|
62
|
+
@mutex = Mutex.new
|
86
63
|
|
87
|
-
|
88
|
-
end
|
64
|
+
@last_fn = get_work_directory + '/wfidgen.last'
|
89
65
|
|
90
|
-
|
91
|
-
# The actual job of turning the numeric result into a String.
|
92
|
-
# This method is overriden in extension of this class.
|
93
|
-
#
|
94
|
-
def to_string (numeric_id)
|
66
|
+
load_last()
|
95
67
|
|
96
|
-
|
97
|
-
|
68
|
+
ensure_last_f
|
69
|
+
end
|
98
70
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
71
|
+
#
|
72
|
+
# Returns a new workflow instance id
|
73
|
+
#
|
74
|
+
# The launchitem parameter is not used by this generator.
|
75
|
+
#
|
76
|
+
def generate (launchitem=nil)
|
103
77
|
|
104
|
-
|
105
|
-
end
|
78
|
+
wfid = nil
|
106
79
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
80
|
+
@mutex.synchronize do
|
81
|
+
wfid = now
|
82
|
+
wfid = @last + 1 if wfid <= @last
|
83
|
+
@last = wfid
|
84
|
+
save_last
|
85
|
+
end
|
112
86
|
|
113
|
-
|
114
|
-
|
115
|
-
r << wfid[i, 1]
|
116
|
-
end
|
87
|
+
to_string(wfid)
|
88
|
+
end
|
117
89
|
|
118
|
-
|
119
|
-
|
90
|
+
#
|
91
|
+
# The actual job of turning the numeric result into a String.
|
92
|
+
# This method is overriden in extension of this class.
|
93
|
+
#
|
94
|
+
def to_string (numeric_id)
|
120
95
|
|
121
|
-
|
122
|
-
|
123
|
-
# In this particular implementation, makes sure the "wfidgen.last"
|
124
|
-
# file is closed.
|
125
|
-
#
|
126
|
-
def stop
|
96
|
+
numeric_id.to_s
|
97
|
+
end
|
127
98
|
|
128
|
-
|
129
|
-
|
130
|
-
|
99
|
+
#
|
100
|
+
# Is a simple call to OpenWFE::split_wfid()
|
101
|
+
#
|
102
|
+
def split_wfid (wfid)
|
131
103
|
|
132
|
-
|
133
|
-
|
134
|
-
def ensure_last_f
|
135
|
-
if (not @last_f) or @last_f.closed?
|
136
|
-
begin
|
137
|
-
@last_f = File.open(@last_fn, "w+")
|
138
|
-
rescue Exception => e
|
139
|
-
lwarn do
|
140
|
-
"new() failed to open #{@last_fn}, "+
|
141
|
-
"continuing anyway...\n"+
|
142
|
-
OpenWFE::exception_to_s(e)
|
143
|
-
end
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
104
|
+
OpenWFE.split_wfid(wfid)
|
105
|
+
end
|
147
106
|
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
107
|
+
#
|
108
|
+
# This method is called by OpenWFE::split_wfid() when it has detected
|
109
|
+
# a wfid following this 'defaut' scheme.
|
110
|
+
#
|
111
|
+
def self.split_wfid (wfid)
|
152
112
|
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
@last_f.puts @last
|
158
|
-
end
|
113
|
+
r = []
|
114
|
+
0.upto(wfid.length-1) do |i|
|
115
|
+
r << wfid[i, 1]
|
116
|
+
end
|
159
117
|
|
160
|
-
|
161
|
-
@mutex.synchronize do
|
162
|
-
|
163
|
-
if File.exist?(@last_fn)
|
164
|
-
begin
|
165
|
-
s = File.open(@last_fn, "r") do |f|
|
166
|
-
f.readline
|
167
|
-
end
|
168
|
-
@last = Integer(s)
|
169
|
-
#puts @last
|
170
|
-
rescue Exception => e
|
171
|
-
#puts
|
172
|
-
#puts e.to_s
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
n = now
|
177
|
-
|
178
|
-
@last = n if (not @last) or (@last < n)
|
179
|
-
end
|
180
|
-
end
|
118
|
+
r
|
181
119
|
end
|
182
120
|
|
183
121
|
#
|
184
|
-
#
|
185
|
-
#
|
186
|
-
#
|
187
|
-
#
|
188
|
-
# Now relying on the 'rufus-mnemo' gem.
|
122
|
+
# Stops this service.
|
123
|
+
# In this particular implementation, makes sure the "wfidgen.last"
|
124
|
+
# file is closed.
|
189
125
|
#
|
190
|
-
|
126
|
+
def stop
|
191
127
|
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
128
|
+
#linfo { "stop() stopping '#{@service_name}'" }
|
129
|
+
if @last_f
|
130
|
+
@last_f.close rescue nil
|
131
|
+
end
|
132
|
+
end
|
196
133
|
|
197
|
-
|
134
|
+
protected
|
135
|
+
|
136
|
+
def ensure_last_f
|
137
|
+
if (not @last_f) or @last_f.closed?
|
138
|
+
begin
|
139
|
+
@last_f = File.open(@last_fn, "w+")
|
140
|
+
rescue Exception => e
|
141
|
+
lwarn do
|
142
|
+
"new() failed to open #{@last_fn}, "+
|
143
|
+
"continuing anyway...\n"+
|
144
|
+
OpenWFE::exception_to_s(e)
|
145
|
+
end
|
146
|
+
end
|
198
147
|
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def now
|
151
|
+
wfid = Time.now.to_f * 1000 * 10
|
152
|
+
wfid.to_i
|
153
|
+
end
|
154
|
+
|
155
|
+
def save_last
|
156
|
+
return unless @last_f
|
157
|
+
ensure_last_f()
|
158
|
+
@last_f.pos = 0
|
159
|
+
@last_f.puts @last
|
160
|
+
end
|
161
|
+
|
162
|
+
def load_last
|
163
|
+
@mutex.synchronize do
|
164
|
+
|
165
|
+
if File.exist?(@last_fn)
|
166
|
+
begin
|
167
|
+
s = File.open(@last_fn, "r") do |f|
|
168
|
+
f.readline
|
169
|
+
end
|
170
|
+
@last = Integer(s)
|
171
|
+
#puts @last
|
172
|
+
rescue Exception => e
|
173
|
+
#puts
|
174
|
+
#puts e.to_s
|
175
|
+
end
|
176
|
+
end
|
199
177
|
|
200
|
-
|
201
|
-
# That's here that the numeric wfid gets turned into a 'kotoba'.
|
202
|
-
# A static method easily accessible by any.
|
203
|
-
#
|
204
|
-
def self.to_string (numeric_id)
|
205
|
-
|
206
|
-
i = numeric_id % (10 * 1000 * 60 * 60 * 24)
|
207
|
-
t = Time.now.gmtime
|
178
|
+
n = now
|
208
179
|
|
209
|
-
|
210
|
-
s << "-"
|
211
|
-
s << Rufus::Mnemo::from_integer(i)
|
212
|
-
s
|
180
|
+
@last = n if (not @last) or (@last < n)
|
213
181
|
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
#
|
186
|
+
# This extension of DefaultWfidGenerator produces ids like
|
187
|
+
# "20070318-jonowoguya" or "20071224-jesoshimoha" that are a bit
|
188
|
+
# easier to grasp than full integer wfids.
|
189
|
+
#
|
190
|
+
# Now relying on the 'rufus-mnemo' gem.
|
191
|
+
#
|
192
|
+
class KotobaWfidGenerator < DefaultWfidGenerator
|
214
193
|
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
#
|
220
|
-
def self.split_wfid (wfid)
|
194
|
+
#
|
195
|
+
# Overrides the to_string() method of the DefaultWfidGenerator,
|
196
|
+
#
|
197
|
+
def to_string (numeric_id)
|
221
198
|
|
222
|
-
|
223
|
-
|
199
|
+
self.class.to_string(numeric_id)
|
200
|
+
end
|
224
201
|
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
202
|
+
#
|
203
|
+
# That's here that the numeric wfid gets turned into a 'kotoba'.
|
204
|
+
# A static method easily accessible by any.
|
205
|
+
#
|
206
|
+
def self.to_string (numeric_id)
|
229
207
|
|
230
|
-
|
231
|
-
|
232
|
-
day = wfid[6, 2]
|
208
|
+
i = numeric_id % (10 * 1000 * 60 * 60 * 24)
|
209
|
+
t = Time.now.gmtime
|
233
210
|
|
234
|
-
|
211
|
+
s = sprintf "%4d%02d%02d", t.year, t.month, t.day
|
212
|
+
s << "-"
|
213
|
+
s << Rufus::Mnemo::from_integer(i)
|
214
|
+
s
|
215
|
+
end
|
235
216
|
|
236
|
-
|
217
|
+
#
|
218
|
+
# This method is called by OpenWFE::split_wfid() when it has detected
|
219
|
+
# a wfid following the 'kotoba' scheme.
|
220
|
+
# Returns the 'kotoba' wfid split into its syllables
|
221
|
+
#
|
222
|
+
def self.split_wfid (wfid)
|
237
223
|
|
238
|
-
|
239
|
-
|
240
|
-
sec = (i / 10000) % 60
|
241
|
-
usec = (i * 100) % 1000000
|
224
|
+
Rufus::Mnemo::split(wfid[9..-1])
|
225
|
+
end
|
242
226
|
|
243
|
-
|
227
|
+
#
|
228
|
+
# Turns a KotobaWfidGenerator produced wfid into a UTC date.
|
229
|
+
#
|
230
|
+
def self.to_time (wfid)
|
244
231
|
|
245
|
-
|
246
|
-
|
232
|
+
year = wfid[0, 4]
|
233
|
+
month = wfid[4, 2]
|
234
|
+
day = wfid[6, 2]
|
247
235
|
|
248
|
-
|
236
|
+
s = wfid[9..-1]
|
249
237
|
|
250
|
-
|
251
|
-
end
|
252
|
-
end
|
238
|
+
i = Rufus::Mnemo::to_integer(s)
|
253
239
|
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
# If there is no launchitem or no field, a Kotoba wfid is returned.
|
259
|
-
#
|
260
|
-
# This generator is useful for engines that have to use workflow
|
261
|
-
# instance ids generated by other systems.
|
262
|
-
#
|
263
|
-
class FieldWfidGenerator < KotobaWfidGenerator
|
240
|
+
hour = (i / (10000 * 60 * 60)) % 24
|
241
|
+
min = (i / (10000 * 60)) % 60
|
242
|
+
sec = (i / 10000) % 60
|
243
|
+
usec = (i * 100) % 1000000
|
264
244
|
|
265
|
-
|
245
|
+
#puts "hms #{hour} #{min} #{sec} #{usec}"
|
266
246
|
|
267
|
-
|
247
|
+
Time.utc(year, month, day, hour, min, sec, usec)
|
248
|
+
end
|
268
249
|
|
269
|
-
|
270
|
-
end
|
250
|
+
def self.from_time (t)
|
271
251
|
|
272
|
-
|
252
|
+
to_string(t.to_f * 10 * 1000).to_i
|
253
|
+
end
|
254
|
+
end
|
273
255
|
|
274
|
-
|
256
|
+
#
|
257
|
+
# This wfid generator returns as wfid the value found in a given
|
258
|
+
# field of the launchitem (if any).
|
259
|
+
#
|
260
|
+
# If there is no launchitem or no field, a Kotoba wfid is returned.
|
261
|
+
#
|
262
|
+
# This generator is useful for engines that have to use workflow
|
263
|
+
# instance ids generated by other systems.
|
264
|
+
#
|
265
|
+
class FieldWfidGenerator < KotobaWfidGenerator
|
275
266
|
|
276
|
-
|
267
|
+
def initialize (service_name, application_context, field_name)
|
277
268
|
|
278
|
-
|
269
|
+
super service_name, application_context
|
279
270
|
|
280
|
-
|
281
|
-
#
|
282
|
-
# if the field is not present in the launchitem, will
|
283
|
-
# return a Kotoba wfid
|
284
|
-
end
|
271
|
+
@field_name = field_name
|
285
272
|
end
|
286
273
|
|
287
|
-
|
288
|
-
# A wfid generator that uses any underlying "uuidgen" command it might
|
289
|
-
# find.
|
290
|
-
# By default, it favours "uuidgen -t".
|
291
|
-
#
|
292
|
-
# You can specifying a command by passing a :uuid_command param in the
|
293
|
-
# application context, or simply by overriding the generate() method.
|
294
|
-
#
|
295
|
-
class UuidWfidGenerator < Service
|
296
|
-
|
297
|
-
COMMANDS = [
|
298
|
-
"uuidgen -t",
|
299
|
-
"uuidgen"
|
300
|
-
]
|
301
|
-
|
302
|
-
def initialize (service_name, application_context)
|
303
|
-
|
304
|
-
super
|
305
|
-
|
306
|
-
@command = @application_context[:uuid_command] \
|
307
|
-
if @application_context
|
308
|
-
|
309
|
-
unless @command
|
310
|
-
COMMANDS.each do |c|
|
311
|
-
c = "#{c} 2> /dev/null"
|
312
|
-
s = `#{c}`
|
313
|
-
h = s[0, 8].hex
|
314
|
-
if h > 0
|
315
|
-
@command = c
|
316
|
-
break
|
317
|
-
end
|
318
|
-
end
|
319
|
-
end
|
274
|
+
def generate (launchitem=nil)
|
320
275
|
|
321
|
-
|
322
|
-
unless @command
|
276
|
+
return super unless launchitem
|
323
277
|
|
324
|
-
|
325
|
-
end
|
278
|
+
wfid = launchitem.attributes[@field_name]
|
326
279
|
|
327
|
-
|
328
|
-
# Generates a brand new UUID
|
329
|
-
#
|
330
|
-
# The launchitem parameter is not used by this generator.
|
331
|
-
#
|
332
|
-
def generate (launchitem=nil)
|
280
|
+
return wfid.to_s if wfid
|
333
281
|
|
334
|
-
|
282
|
+
super
|
283
|
+
#
|
284
|
+
# if the field is not present in the launchitem, will
|
285
|
+
# return a Kotoba wfid
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
#
|
290
|
+
# A wfid generator that uses any underlying "uuidgen" command it might
|
291
|
+
# find.
|
292
|
+
# By default, it favours "uuidgen -t".
|
293
|
+
#
|
294
|
+
# You can specifying a command by passing a :uuid_command param in the
|
295
|
+
# application context, or simply by overriding the generate() method.
|
296
|
+
#
|
297
|
+
class UuidWfidGenerator < Service
|
298
|
+
|
299
|
+
COMMANDS = [
|
300
|
+
"uuidgen -t",
|
301
|
+
"uuidgen"
|
302
|
+
]
|
303
|
+
|
304
|
+
def initialize (service_name, application_context)
|
305
|
+
|
306
|
+
super
|
307
|
+
|
308
|
+
@command = @application_context[:uuid_command] \
|
309
|
+
if @application_context
|
310
|
+
|
311
|
+
unless @command
|
312
|
+
COMMANDS.each do |c|
|
313
|
+
c = "#{c} 2> /dev/null"
|
314
|
+
s = `#{c}`
|
315
|
+
h = s[0, 8].hex
|
316
|
+
if h > 0
|
317
|
+
@command = c
|
318
|
+
break
|
319
|
+
end
|
335
320
|
end
|
321
|
+
end
|
336
322
|
|
337
|
-
|
338
|
-
|
339
|
-
#
|
340
|
-
def split_wfid (wfid)
|
323
|
+
raise "no command found for generating an uuid found..." \
|
324
|
+
unless @command
|
341
325
|
|
342
|
-
|
343
|
-
|
326
|
+
linfo { "new() command that will be used : '#{@command}'" }
|
327
|
+
end
|
344
328
|
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
#
|
352
|
-
def self.split_wfid (wfid)
|
329
|
+
#
|
330
|
+
# Generates a brand new UUID
|
331
|
+
#
|
332
|
+
# The launchitem parameter is not used by this generator.
|
333
|
+
#
|
334
|
+
def generate (launchitem=nil)
|
353
335
|
|
354
|
-
|
355
|
-
a = []
|
356
|
-
4.times do |i|
|
357
|
-
a << s[i*2, 2]
|
358
|
-
end
|
359
|
-
a
|
360
|
-
end
|
336
|
+
`#{@command}`.chomp
|
361
337
|
end
|
362
338
|
|
363
339
|
#
|
364
|
-
#
|
340
|
+
# Is a simple call to OpenWFE::split_wfid()
|
365
341
|
#
|
342
|
+
def split_wfid (wfid)
|
366
343
|
|
367
|
-
|
368
|
-
|
369
|
-
"[0-9]{8}-[a-z]*" => KotobaWfidGenerator
|
370
|
-
}
|
344
|
+
OpenWFE.split_wfid(wfid)
|
345
|
+
end
|
371
346
|
|
372
347
|
#
|
373
|
-
# This method
|
374
|
-
#
|
348
|
+
# This method is called by OpenWFE::split_wfid() when it has detected
|
349
|
+
# a wfid that is a UUID.
|
375
350
|
#
|
376
|
-
|
351
|
+
# Splits the first part of the uuid (will be used for the
|
352
|
+
# expression storage directory structure).
|
353
|
+
#
|
354
|
+
def self.split_wfid (wfid)
|
355
|
+
|
356
|
+
s = wfid[0, 8]
|
357
|
+
a = []
|
358
|
+
4.times do |i|
|
359
|
+
a << s[i*2, 2]
|
360
|
+
end
|
361
|
+
a
|
362
|
+
end
|
363
|
+
end
|
377
364
|
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
365
|
+
#
|
366
|
+
# "module methods"
|
367
|
+
#
|
368
|
+
|
369
|
+
SPLIT_MAP = {
|
370
|
+
"[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}" => UuidWfidGenerator,
|
371
|
+
"[0-9]{8}-[a-z]*" => KotobaWfidGenerator
|
372
|
+
}
|
373
|
+
|
374
|
+
#
|
375
|
+
# This method should be able to split any wfid whose scheme is implemented
|
376
|
+
# here.
|
377
|
+
#
|
378
|
+
def OpenWFE.split_wfid (wfid)
|
379
|
+
|
380
|
+
SPLIT_MAP.each do |regex, clazz|
|
381
|
+
return clazz.split_wfid(wfid) if wfid.match(regex)
|
385
382
|
end
|
383
|
+
#
|
384
|
+
# else
|
385
|
+
#
|
386
|
+
DefaultWfidGenerator.split_wfid(wfid)
|
387
|
+
end
|
386
388
|
|
387
389
|
end
|
388
390
|
|