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.
- data/README.txt +24 -0
- data/bin/validate-workflow.rb +89 -0
- data/examples/about_state.rb +81 -0
- data/examples/bigflow.rb +19 -0
- data/examples/csv_weather.rb +23 -0
- data/examples/engine_template.rb +247 -0
- data/examples/flowtracing.rb +24 -0
- data/examples/homeworkreview.rb +68 -0
- data/examples/kotoba.rb +22 -0
- data/examples/mano_tracker.rb +172 -0
- data/examples/openwferu.rb +58 -0
- data/examples/quotereporter.rb +157 -0
- data/examples/scheduler_cron_usage.rb +48 -0
- data/examples/scheduler_usage.rb +56 -0
- data/lib/openwfe.rb +41 -0
- data/lib/openwfe/contextual.rb +111 -0
- data/lib/openwfe/def.rb +46 -0
- data/lib/openwfe/engine.rb +37 -0
- data/lib/openwfe/engine/engine.rb +756 -0
- data/lib/openwfe/engine/expool_methods.rb +172 -0
- data/lib/openwfe/engine/file_persisted_engine.rb +105 -0
- data/lib/openwfe/engine/participant_methods.rb +133 -0
- data/lib/openwfe/engine/status_methods.rb +353 -0
- data/lib/openwfe/engine/update_exp_methods.rb +112 -0
- data/lib/openwfe/exceptions.rb +51 -0
- data/lib/openwfe/expool/errorjournal.rb +476 -0
- data/lib/openwfe/expool/expressionpool.rb +1144 -0
- data/lib/openwfe/expool/expstorage.rb +403 -0
- data/lib/openwfe/expool/history.rb +174 -0
- data/lib/openwfe/expool/journal.rb +224 -0
- data/lib/openwfe/expool/journal_replay.rb +321 -0
- data/lib/openwfe/expool/parser.rb +242 -0
- data/lib/openwfe/expool/representation.rb +121 -0
- data/lib/openwfe/expool/threadedexpstorage.rb +188 -0
- data/lib/openwfe/expool/wfidgen.rb +388 -0
- data/lib/openwfe/expool/yamlexpstorage.rb +224 -0
- data/lib/openwfe/expressions/condition.rb +244 -0
- data/lib/openwfe/expressions/environment.rb +246 -0
- data/lib/openwfe/expressions/expressionmap.rb +258 -0
- data/lib/openwfe/expressions/fe_cancel.rb +109 -0
- data/lib/openwfe/expressions/fe_command.rb +241 -0
- data/lib/openwfe/expressions/fe_concurrence.rb +662 -0
- data/lib/openwfe/expressions/fe_cron.rb +259 -0
- data/lib/openwfe/expressions/fe_cursor.rb +259 -0
- data/lib/openwfe/expressions/fe_define.rb +192 -0
- data/lib/openwfe/expressions/fe_do.rb +168 -0
- data/lib/openwfe/expressions/fe_equals.rb +291 -0
- data/lib/openwfe/expressions/fe_filter.rb +129 -0
- data/lib/openwfe/expressions/fe_filter_definition.rb +168 -0
- data/lib/openwfe/expressions/fe_fqv.rb +250 -0
- data/lib/openwfe/expressions/fe_if.rb +303 -0
- data/lib/openwfe/expressions/fe_iterator.rb +145 -0
- data/lib/openwfe/expressions/fe_listen.rb +371 -0
- data/lib/openwfe/expressions/fe_losfor.rb +111 -0
- data/lib/openwfe/expressions/fe_misc.rb +421 -0
- data/lib/openwfe/expressions/fe_participant.rb +269 -0
- data/lib/openwfe/expressions/fe_reserve.rb +212 -0
- data/lib/openwfe/expressions/fe_save.rb +274 -0
- data/lib/openwfe/expressions/fe_sequence.rb +117 -0
- data/lib/openwfe/expressions/fe_set.rb +139 -0
- data/lib/openwfe/expressions/fe_sleep.rb +166 -0
- data/lib/openwfe/expressions/fe_step.rb +159 -0
- data/lib/openwfe/expressions/fe_subprocess.rb +168 -0
- data/lib/openwfe/expressions/fe_timeout.rb +127 -0
- data/lib/openwfe/expressions/fe_wait.rb +78 -0
- data/lib/openwfe/expressions/fe_when.rb +142 -0
- data/lib/openwfe/expressions/filter.rb +104 -0
- data/lib/openwfe/expressions/flowexpression.rb +847 -0
- data/lib/openwfe/expressions/iterator.rb +221 -0
- data/lib/openwfe/expressions/merge.rb +84 -0
- data/lib/openwfe/expressions/raw.rb +547 -0
- data/lib/openwfe/expressions/rprocdef.rb +375 -0
- data/lib/openwfe/expressions/time.rb +333 -0
- data/lib/openwfe/expressions/timeout.rb +178 -0
- data/lib/openwfe/expressions/value.rb +126 -0
- data/lib/openwfe/filterdef.rb +259 -0
- data/lib/openwfe/flowexpressionid.rb +357 -0
- data/lib/openwfe/listeners/listener.rb +97 -0
- data/lib/openwfe/listeners/listeners.rb +139 -0
- data/lib/openwfe/listeners/socketlisteners.rb +272 -0
- data/lib/openwfe/logging.rb +122 -0
- data/lib/openwfe/omixins.rb +95 -0
- data/lib/openwfe/orest/controlclient.rb +119 -0
- data/lib/openwfe/orest/definitions.rb +113 -0
- data/lib/openwfe/orest/exception.rb +60 -0
- data/lib/openwfe/orest/oldrestservlet.rb +279 -0
- data/lib/openwfe/orest/osocket.rb +148 -0
- data/lib/openwfe/orest/restclient.rb +176 -0
- data/lib/openwfe/orest/workitem.rb +206 -0
- data/lib/openwfe/orest/worklistclient.rb +272 -0
- data/lib/openwfe/orest/xmlcodec.rb +670 -0
- data/lib/openwfe/participants.rb +38 -0
- data/lib/openwfe/participants/enoparticipants.rb +230 -0
- data/lib/openwfe/participants/participant.rb +141 -0
- data/lib/openwfe/participants/participantmap.rb +249 -0
- data/lib/openwfe/participants/participants.rb +407 -0
- data/lib/openwfe/participants/soapparticipants.rb +135 -0
- data/lib/openwfe/participants/socketparticipants.rb +202 -0
- data/lib/openwfe/participants/storeparticipants.rb +254 -0
- data/lib/openwfe/rudefinitions.rb +130 -0
- data/lib/openwfe/service.rb +103 -0
- data/lib/openwfe/storage/yamlcustom.rb +106 -0
- data/lib/openwfe/storage/yamlfilestorage.rb +245 -0
- data/lib/openwfe/tools/flowtracer.rb +81 -0
- data/lib/openwfe/util/dollar.rb +217 -0
- data/lib/openwfe/util/irb.rb +86 -0
- data/lib/openwfe/util/observable.rb +144 -0
- data/lib/openwfe/util/ometa.rb +62 -0
- data/lib/openwfe/util/workqueue.rb +124 -0
- data/lib/openwfe/util/xml.rb +418 -0
- data/lib/openwfe/utils.rb +554 -0
- data/lib/openwfe/version.rb +37 -0
- data/lib/openwfe/workitem.rb +499 -0
- data/lib/openwfe/worklist/oldrest.rb +244 -0
- data/lib/openwfe/worklist/storelocks.rb +293 -0
- data/lib/openwfe/worklist/storeparticipant.rb +44 -0
- data/lib/openwfe/worklist/worklist.rb +297 -0
- data/test/README.txt +27 -0
- data/test/back_0916_test.rb +111 -0
- data/test/bm/bm_1_xml_vs_prog.rb +56 -0
- data/test/bm/bm_2_step.rb +109 -0
- data/test/bm/ft_0f_5ms.rb +35 -0
- data/test/bm/ft_26_load.rb +210 -0
- data/test/bm/ft_26b_load.rb +86 -0
- data/test/bm/ft_26c_load.rb +97 -0
- data/test/bm/ft_26d_load.rb +97 -0
- data/test/bm/ft_recu.rb +71 -0
- data/test/clone_test.rb +122 -0
- data/test/concurrence_test.rb +77 -0
- data/test/condition_test.rb +155 -0
- data/test/console_test.rb +12 -0
- data/test/cron_ltest.rb +15 -0
- data/test/description_test.rb +87 -0
- data/test/eno_test.rb +76 -0
- data/test/expmap_test.rb +54 -0
- data/test/expool_20031219_0916.tgz +0 -0
- data/test/fe_lookup_att_test.rb +62 -0
- data/test/fei_test.rb +181 -0
- data/test/file_persisted_engine_test.rb +64 -0
- data/test/file_persistence_test.rb +134 -0
- data/test/filep_cancel_test.rb +123 -0
- data/test/filter_test.rb +109 -0
- data/test/flowtestbase.rb +351 -0
- data/test/ft_0.rb +68 -0
- data/test/ft_0b_sequence.rb +36 -0
- data/test/ft_0c_testname.rb +33 -0
- data/test/ft_0d_participant.rb +30 -0
- data/test/ft_0e_multibody.rb +34 -0
- data/test/ft_10_loop.rb +134 -0
- data/test/ft_11_ppd.rb +415 -0
- data/test/ft_11b_ppd.rb +54 -0
- data/test/ft_12_blockparticipant.rb +97 -0
- data/test/ft_13_eno.rb +52 -0
- data/test/ft_14_subprocess.rb +88 -0
- data/test/ft_14b_subprocess.rb +192 -0
- data/test/ft_14c_subprocess.rb +68 -0
- data/test/ft_15_iterator.rb +216 -0
- data/test/ft_15b_iterator.rb +74 -0
- data/test/ft_16_fqv.rb +73 -0
- data/test/ft_17_condition.rb +84 -0
- data/test/ft_18_pname.rb +56 -0
- data/test/ft_1_unset.rb +175 -0
- data/test/ft_1b_unset.rb +39 -0
- data/test/ft_20_cron.rb +53 -0
- data/test/ft_21_cron.rb +87 -0
- data/test/ft_21b_cron_pause.rb +82 -0
- data/test/ft_22_history.rb +74 -0
- data/test/ft_23_when.rb +77 -0
- data/test/ft_23b_when.rb +70 -0
- data/test/ft_23c_wait.rb +80 -0
- data/test/ft_23d_cww.rb +58 -0
- data/test/ft_24_def.rb +44 -0
- data/test/ft_25_cancel.rb +89 -0
- data/test/ft_27_getflowpos.rb +147 -0
- data/test/ft_28_fileparticipant.rb +63 -0
- data/test/ft_29_httprb.rb +106 -0
- data/test/ft_2_concurrence.rb +135 -0
- data/test/ft_2b_concurrence.rb +188 -0
- data/test/ft_2c_concurrence.rb +64 -0
- data/test/ft_30_socketlistener.rb +203 -0
- data/test/ft_31_flowname.rb +40 -0
- data/test/ft_32_journal.rb +91 -0
- data/test/ft_32c_journal.rb +102 -0
- data/test/ft_32d_journal.rb +84 -0
- data/test/ft_33_description.rb +107 -0
- data/test/ft_34_cancelwfid.rb +80 -0
- data/test/ft_35_localdefs.rb +75 -0
- data/test/ft_36_subprocids.rb +97 -0
- data/test/ft_37_pnames.rb +70 -0
- data/test/ft_38_tag.rb +127 -0
- data/test/ft_38b_tag.rb +161 -0
- data/test/ft_38c_tag.rb +100 -0
- data/test/ft_39_reserve.rb +63 -0
- data/test/ft_39b_reserve.rb +84 -0
- data/test/ft_3_equals.rb +170 -0
- data/test/ft_3b_lookup_vf.rb +83 -0
- data/test/ft_40_defined.rb +61 -0
- data/test/ft_41_case.rb +110 -0
- data/test/ft_42_environments.rb +75 -0
- data/test/ft_43_pat10.rb +85 -0
- data/test/ft_44_save.rb +70 -0
- data/test/ft_44b_restore.rb +212 -0
- data/test/ft_45_citerator.rb +214 -0
- data/test/ft_46_pparams.rb +62 -0
- data/test/ft_47_filter.rb +160 -0
- data/test/ft_48_fe_filter.rb +88 -0
- data/test/ft_49_condition.rb +126 -0
- data/test/ft_4_misc.rb +237 -0
- data/test/ft_50_xml_attribute.rb +155 -0
- data/test/ft_51_stack.rb +55 -0
- data/test/ft_52_obs_participant.rb +123 -0
- data/test/ft_53_null_noop_participant.rb +62 -0
- data/test/ft_54_listen.rb +288 -0
- data/test/ft_54b_listen.rb +66 -0
- data/test/ft_54c_listen.rb +99 -0
- data/test/ft_55_ptimeout.rb +59 -0
- data/test/ft_56_timeout.rb +59 -0
- data/test/ft_57_a.rb +145 -0
- data/test/ft_58_ejournal.rb +151 -0
- data/test/ft_59_ps.rb +150 -0
- data/test/ft_59b_ps_for_pat.rb +58 -0
- data/test/ft_5_time.rb +118 -0
- data/test/ft_60_ecancel.rb +161 -0
- data/test/ft_61_elsub.rb +51 -0
- data/test/ft_62_procparticipant.rb +71 -0
- data/test/ft_63_pause.rb +124 -0
- data/test/ft_64_alias.rb +102 -0
- data/test/ft_64_clone.rb +69 -0
- data/test/ft_65_stringlaunch.rb +59 -0
- data/test/ft_66_subforget.rb +70 -0
- data/test/ft_67_schedlaunch.rb +116 -0
- data/test/ft_68_ifparticipant.rb +70 -0
- data/test/ft_69_cancelmissing.rb +51 -0
- data/test/ft_6_lambda.rb +64 -0
- data/test/ft_70_lookupvar.rb +55 -0
- data/test/ft_71_log.rb +60 -0
- data/test/ft_72_lookup_processes.rb +76 -0
- data/test/ft_73_cancel_sub.rb +139 -0
- data/test/ft_74_block_and_workitem_dup.rb +63 -0
- data/test/ft_75_ruby_attributes.rb +87 -0
- data/test/ft_76_merge_isolate.rb +88 -0
- data/test/ft_77_segments.rb +35 -0
- data/test/ft_78_eval.rb +150 -0
- data/test/ft_79_tticket.rb +187 -0
- data/test/ft_79b_tticket.rb +172 -0
- data/test/ft_79c_outcome.rb +56 -0
- data/test/ft_7_lose.rb +104 -0
- data/test/ft_7b_lose.rb +78 -0
- data/test/ft_80_spname.rb +91 -0
- data/test/ft_81_exp.rb +60 -0
- data/test/ft_82_trecu.rb +46 -0
- data/test/ft_83_badpause.rb +58 -0
- data/test/ft_84_updateexp.rb +198 -0
- data/test/ft_85_dolhash.rb +43 -0
- data/test/ft_86_dollar_fv.rb +68 -0
- data/test/ft_87_define.rb +74 -0
- data/test/ft_8_forget.rb +44 -0
- data/test/ft_9_cursor.rb +145 -0
- data/test/ft_9b_cursor.rb +105 -0
- data/test/ft_tests.rb +124 -0
- data/test/hash_test.rb +75 -0
- data/test/hparticipant_test.rb +164 -0
- data/test/lookup_att_test.rb +90 -0
- data/test/lookup_vf_test.rb +94 -0
- data/test/misc_test.rb +90 -0
- data/test/nut_0_irb.rb +20 -0
- data/test/obs_test.rb +142 -0
- data/test/orest_test.rb +251 -0
- data/test/param_test.rb +290 -0
- data/test/participant_test.rb +101 -0
- data/test/pending.rb +23 -0
- data/test/ps_representation.rb +133 -0
- data/test/rake_ltest.rb +38 -0
- data/test/rake_qtest.rb +68 -0
- data/test/raw_prog_test.rb +412 -0
- data/test/restart_cron_test.rb +136 -0
- data/test/restart_paused_test.rb +98 -0
- data/test/restart_sleep_test.rb +140 -0
- data/test/restart_tests.rb +18 -0
- data/test/restart_when_test.rb +112 -0
- data/test/ruby_procdef_test.rb +132 -0
- data/test/rutest_utils.rb +63 -0
- data/test/sec_test.rb +205 -0
- data/test/slock_test.rb +80 -0
- data/test/storage_test.rb +44 -0
- data/test/test.rb +3 -0
- data/test/timeout_test.rb +105 -0
- data/test/util_xml_test.rb +112 -0
- data/test/wfid_test.rb +175 -0
- data/test/wi_test.rb +75 -0
- metadata +433 -0
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
#
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 2006-2008, Nicolas Modryzk and 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
|
+
# Nicolas Modrzyk at openwfe.org
|
|
38
|
+
# John Mettraux at openwfe.org
|
|
39
|
+
#
|
|
40
|
+
|
|
41
|
+
require 'fileutils'
|
|
42
|
+
|
|
43
|
+
#require 'rufus/lru'
|
|
44
|
+
|
|
45
|
+
require 'openwfe/service'
|
|
46
|
+
require 'openwfe/flowexpressionid'
|
|
47
|
+
require 'openwfe/rudefinitions'
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
module OpenWFE
|
|
51
|
+
|
|
52
|
+
#
|
|
53
|
+
# This module contains the observe_expool method which binds the
|
|
54
|
+
# storage to the expression pool.
|
|
55
|
+
# It also features a to_s method for the expression storages including
|
|
56
|
+
# it.
|
|
57
|
+
#
|
|
58
|
+
module ExpressionStorageBase
|
|
59
|
+
|
|
60
|
+
def observe_expool
|
|
61
|
+
|
|
62
|
+
get_expression_pool.add_observer(:update) do |channel, fei, fe|
|
|
63
|
+
ldebug { ":update for #{fei}" }
|
|
64
|
+
self[fei] = fe
|
|
65
|
+
end
|
|
66
|
+
get_expression_pool.add_observer(:remove) do |channel, fei|
|
|
67
|
+
ldebug { ":delete for #{fei}" }
|
|
68
|
+
self.delete fei
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
#
|
|
73
|
+
# a human readable representation of the content of the expression
|
|
74
|
+
# storage.
|
|
75
|
+
#
|
|
76
|
+
# Warning : this will display the content of the real storage,
|
|
77
|
+
# (especially when called against a cache).
|
|
78
|
+
#
|
|
79
|
+
def to_s
|
|
80
|
+
|
|
81
|
+
s = "\n\n==== #{self.class} ===="
|
|
82
|
+
|
|
83
|
+
find_expressions.each do |fexp|
|
|
84
|
+
|
|
85
|
+
s << "\n"
|
|
86
|
+
if fexp.kind_of?(RawExpression)
|
|
87
|
+
s << "*raw"
|
|
88
|
+
else
|
|
89
|
+
s << " "
|
|
90
|
+
end
|
|
91
|
+
s << fexp.fei.to_s
|
|
92
|
+
end
|
|
93
|
+
s << "\n==== . ====\n"
|
|
94
|
+
|
|
95
|
+
s
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
#
|
|
99
|
+
# This method is used by the various implementations of
|
|
100
|
+
# find_expressions()
|
|
101
|
+
#
|
|
102
|
+
def does_match? (options, fexp_or_fei)
|
|
103
|
+
|
|
104
|
+
wfid = options[:wfid]
|
|
105
|
+
wfid_prefix = options[:wfid_prefix]
|
|
106
|
+
parent_wfid = options[:parent_wfid]
|
|
107
|
+
|
|
108
|
+
wfname = options[:wfname]
|
|
109
|
+
wfrevision = options[:wfrevision]
|
|
110
|
+
|
|
111
|
+
ic = options[:include_classes]
|
|
112
|
+
ec = options[:exclude_classes]
|
|
113
|
+
ic = Array(ic) if ic
|
|
114
|
+
ec = Array(ec) if ec
|
|
115
|
+
|
|
116
|
+
cs = options[:consider_subprocesses]
|
|
117
|
+
|
|
118
|
+
ap = options[:applied]
|
|
119
|
+
|
|
120
|
+
fexp, fei = if fexp_or_fei.is_a?(FlowExpressionId)
|
|
121
|
+
[ nil, fexp_or_fei ]
|
|
122
|
+
else
|
|
123
|
+
[ fexp_or_fei, fexp_or_fei.fei ]
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
#
|
|
127
|
+
# let's make it verbose...
|
|
128
|
+
|
|
129
|
+
if fexp
|
|
130
|
+
return false if (ap == true and not fexp.apply_time)
|
|
131
|
+
return false if (ap == false and fexp.apply_time)
|
|
132
|
+
return false unless class_accepted?(fexp, ic, ec)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
return false \
|
|
136
|
+
if wfname and fei.wfname != wfname
|
|
137
|
+
return false \
|
|
138
|
+
if wfrevision and fei.wfrevision != wfrevision
|
|
139
|
+
|
|
140
|
+
return false \
|
|
141
|
+
if cs and fei.sub_instance_id != ""
|
|
142
|
+
return false \
|
|
143
|
+
if wfid and fei.wfid != wfid
|
|
144
|
+
return false \
|
|
145
|
+
if wfid_prefix and not fei.wfid.match("^#{wfid_prefix}")
|
|
146
|
+
return false \
|
|
147
|
+
if parent_wfid and not fei.parent_wfid == parent_wfid
|
|
148
|
+
|
|
149
|
+
true
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
#
|
|
153
|
+
# Returns true if the given expression is in the list of included
|
|
154
|
+
# classes or false if it's in the list of excluded classes...
|
|
155
|
+
#
|
|
156
|
+
# include_classes has precedence of exclude_classes.
|
|
157
|
+
#
|
|
158
|
+
def class_accepted? (fexp, include_classes, exclude_classes)
|
|
159
|
+
|
|
160
|
+
return false if include_classes and (not include_classes.find do |klazz|
|
|
161
|
+
fexp.is_a?(klazz)
|
|
162
|
+
end)
|
|
163
|
+
return false if exclude_classes and exclude_classes.find do |klazz|
|
|
164
|
+
fexp.is_a?(klazz)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
true
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
#
|
|
172
|
+
# This cache uses a LruHash (Least Recently Used) to store expressions.
|
|
173
|
+
# If an expression is not cached, the 'real storage' is consulted.
|
|
174
|
+
# The real storage is supposed to be the service named
|
|
175
|
+
# "expressionStorage.1"
|
|
176
|
+
#
|
|
177
|
+
class CacheExpressionStorage
|
|
178
|
+
include ServiceMixin
|
|
179
|
+
include OwfeServiceLocator
|
|
180
|
+
include ExpressionStorageBase
|
|
181
|
+
|
|
182
|
+
#
|
|
183
|
+
# under 20 stored expressions, the unit tests for the
|
|
184
|
+
# CachedFilePersistedEngine do fail because the persistent storage
|
|
185
|
+
# behind the cache hasn't the time to flush its work queue.
|
|
186
|
+
# a min size limit has been set to 77.
|
|
187
|
+
#
|
|
188
|
+
MIN_SIZE = 77
|
|
189
|
+
|
|
190
|
+
DEFAULT_SIZE = 5000
|
|
191
|
+
|
|
192
|
+
def initialize (service_name, application_context)
|
|
193
|
+
|
|
194
|
+
super()
|
|
195
|
+
|
|
196
|
+
service_init(service_name, application_context)
|
|
197
|
+
|
|
198
|
+
size = @application_context[:expression_cache_size] || DEFAULT_SIZE
|
|
199
|
+
size = MIN_SIZE unless size > MIN_SIZE
|
|
200
|
+
|
|
201
|
+
linfo { "new() size is #{size}" }
|
|
202
|
+
|
|
203
|
+
@cache = LruHash.new(size)
|
|
204
|
+
|
|
205
|
+
@real_storage = nil
|
|
206
|
+
|
|
207
|
+
observe_expool
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
def [] (fei)
|
|
211
|
+
|
|
212
|
+
#ldebug { "[] size is #{@cache.size}" }
|
|
213
|
+
#ldebug { "[] (sz #{@cache.size}) for #{fei.to_debug_s}" }
|
|
214
|
+
|
|
215
|
+
fe = @cache[fei.hash]
|
|
216
|
+
return fe if fe
|
|
217
|
+
|
|
218
|
+
#ldebug { "[] (reload) for #{fei.to_debug_s}" }
|
|
219
|
+
|
|
220
|
+
fe = get_real_storage[fei]
|
|
221
|
+
|
|
222
|
+
unless fe
|
|
223
|
+
#ldebug { "[] (reload) miss for #{fei.to_debug_s}" }
|
|
224
|
+
return nil
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
@cache[fei.hash] = fe
|
|
228
|
+
|
|
229
|
+
fe
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
def []= (fei, fe)
|
|
233
|
+
|
|
234
|
+
ldebug { "[]= caching #{fei}" }
|
|
235
|
+
|
|
236
|
+
@cache[fei.hash] = fe
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
def delete (fei)
|
|
240
|
+
|
|
241
|
+
@cache.delete fei.hash
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
def length
|
|
245
|
+
|
|
246
|
+
@cache.length
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
alias :size :length
|
|
250
|
+
|
|
251
|
+
def clear
|
|
252
|
+
|
|
253
|
+
@cache.clear
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
alias :purge :clear
|
|
257
|
+
|
|
258
|
+
#
|
|
259
|
+
# This implementations of find_expressions() immediately passes
|
|
260
|
+
# the call to the underlying real storage.
|
|
261
|
+
#
|
|
262
|
+
def find_expressions (options={})
|
|
263
|
+
|
|
264
|
+
get_real_storage.find_expressions options
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
#
|
|
268
|
+
# Attempts at fetching the root expression of a given process
|
|
269
|
+
# instance.
|
|
270
|
+
#
|
|
271
|
+
def fetch_root (wfid)
|
|
272
|
+
|
|
273
|
+
#
|
|
274
|
+
# at first, look in the cache
|
|
275
|
+
|
|
276
|
+
@cache.each do |hashed_fei, fexp|
|
|
277
|
+
|
|
278
|
+
return fexp \
|
|
279
|
+
if fexp.fei.wfid == wfid and fexp.is_a?(DefineExpression)
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
get_real_storage.fetch_root wfid
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
protected
|
|
286
|
+
|
|
287
|
+
#
|
|
288
|
+
# Returns the "real storage" i.e. the storage that does the real
|
|
289
|
+
# persistence behind this "cache storage".
|
|
290
|
+
#
|
|
291
|
+
def get_real_storage
|
|
292
|
+
|
|
293
|
+
#return @real_storage if @real_storage
|
|
294
|
+
#@real_storage =
|
|
295
|
+
# @application_context[S_EXPRESSION_STORAGE + ".1"]
|
|
296
|
+
#@real_storage
|
|
297
|
+
|
|
298
|
+
@application_context["expressionStorage.1"]
|
|
299
|
+
end
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
#
|
|
303
|
+
# Memory consuming in-memory storage.
|
|
304
|
+
# No memory limit, puts everything in a Hash
|
|
305
|
+
#
|
|
306
|
+
class InMemoryExpressionStorage < Hash
|
|
307
|
+
include ServiceMixin
|
|
308
|
+
include OwfeServiceLocator
|
|
309
|
+
include ExpressionStorageBase
|
|
310
|
+
|
|
311
|
+
def initialize (service_name, application_context)
|
|
312
|
+
|
|
313
|
+
service_init service_name, application_context
|
|
314
|
+
|
|
315
|
+
observe_expool
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
alias :purge :clear
|
|
319
|
+
|
|
320
|
+
#--
|
|
321
|
+
# Allows to pass a block to each expressions of a given kind (type).
|
|
322
|
+
#
|
|
323
|
+
#def each_of_kind (kind, &block)
|
|
324
|
+
# self.each_value do |fexp|
|
|
325
|
+
# block.call(fexp.fei, fexp) if fexp.kind_of?(kind)
|
|
326
|
+
# end
|
|
327
|
+
#end
|
|
328
|
+
#
|
|
329
|
+
# An iterator on the expression stored in here.
|
|
330
|
+
#
|
|
331
|
+
#def each (wfid_prefix=nil, &block)
|
|
332
|
+
# if wfid_prefix
|
|
333
|
+
# super() do |fei, fexp|
|
|
334
|
+
# next unless fei.wfid.match "^#{wfid_prefix}"
|
|
335
|
+
# block.call fei, fexp
|
|
336
|
+
# end
|
|
337
|
+
# else
|
|
338
|
+
# super(&block)
|
|
339
|
+
# end
|
|
340
|
+
#end
|
|
341
|
+
#alias :real_each :each
|
|
342
|
+
#++
|
|
343
|
+
|
|
344
|
+
#
|
|
345
|
+
# Finds expressions matching the given criteria (returns a list
|
|
346
|
+
# of expressions).
|
|
347
|
+
#
|
|
348
|
+
# This methods is called by the expression pool, it's thus not
|
|
349
|
+
# very "public" (not used directly by integrators, who should
|
|
350
|
+
# just focus on the methods provided by the Engine).
|
|
351
|
+
#
|
|
352
|
+
# :wfid ::
|
|
353
|
+
# will list only one process,
|
|
354
|
+
# <tt>:wfid => '20071208-gipijiwozo'</tt>
|
|
355
|
+
# :parent_wfid ::
|
|
356
|
+
# will list only one process, and its subprocesses,
|
|
357
|
+
# <tt>:parent_wfid => '20071208-gipijiwozo'</tt>
|
|
358
|
+
# :consider_subprocesses ::
|
|
359
|
+
# if true, "process-definition" expressions
|
|
360
|
+
# of subprocesses will be returned as well.
|
|
361
|
+
# :wfid_prefix ::
|
|
362
|
+
# allows your to query for specific workflow instance
|
|
363
|
+
# id prefixes. for example :
|
|
364
|
+
# <tt>:wfid_prefix => "200712"</tt>
|
|
365
|
+
# for the processes started in December.
|
|
366
|
+
# :include_classes ::
|
|
367
|
+
# excepts a class or an array of classes, only instances of these
|
|
368
|
+
# classes will be returned. Parent classes or mixins can be
|
|
369
|
+
# given.
|
|
370
|
+
# <tt>:includes_classes => OpenWFE::SequenceExpression</tt>
|
|
371
|
+
# :exclude_classes ::
|
|
372
|
+
# works as expected.
|
|
373
|
+
# :wfname ::
|
|
374
|
+
# will return only the expressions who belongs to the given
|
|
375
|
+
# workflow [name].
|
|
376
|
+
# :wfrevision ::
|
|
377
|
+
# usued in conjuction with :wfname, returns only the expressions
|
|
378
|
+
# with a given workflow revision.
|
|
379
|
+
# :applied ::
|
|
380
|
+
# if this option is set to true, will only return the expressions
|
|
381
|
+
# that have been applied (exp.apply_time != nil).
|
|
382
|
+
#
|
|
383
|
+
def find_expressions (options={})
|
|
384
|
+
|
|
385
|
+
values.find_all do |fexp|
|
|
386
|
+
does_match? options, fexp
|
|
387
|
+
end
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
#
|
|
391
|
+
# Attempts at fetching the root expression of a given process
|
|
392
|
+
# instance.
|
|
393
|
+
#
|
|
394
|
+
def fetch_root (wfid)
|
|
395
|
+
|
|
396
|
+
find_expressions(
|
|
397
|
+
:wfid => wfid,
|
|
398
|
+
:include_classes => DefineExpression)[0]
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
end
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
#
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 2007, 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 'date'
|
|
41
|
+
|
|
42
|
+
require 'openwfe/service'
|
|
43
|
+
require 'openwfe/omixins'
|
|
44
|
+
require 'openwfe/rudefinitions'
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
module OpenWFE
|
|
48
|
+
|
|
49
|
+
#
|
|
50
|
+
# A Mixin for history modules
|
|
51
|
+
#
|
|
52
|
+
module HistoryMixin
|
|
53
|
+
include ServiceMixin, OwfeServiceLocator
|
|
54
|
+
|
|
55
|
+
def service_init (service_name, application_context)
|
|
56
|
+
|
|
57
|
+
super
|
|
58
|
+
|
|
59
|
+
get_expression_pool.add_observer(:all) do |event, *args|
|
|
60
|
+
log(event, *args)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def log (event, *args)
|
|
65
|
+
raise NotImplementedError.new(
|
|
66
|
+
"please provide an implementation of log(e, fei, wi)")
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
#
|
|
71
|
+
# A base implementation for InMemoryHistory and FileHistory.
|
|
72
|
+
#
|
|
73
|
+
class BaseHistory
|
|
74
|
+
include HistoryMixin
|
|
75
|
+
include FeiMixin
|
|
76
|
+
|
|
77
|
+
attr_reader :entries
|
|
78
|
+
|
|
79
|
+
def initialize (service_name, application_context)
|
|
80
|
+
|
|
81
|
+
super()
|
|
82
|
+
|
|
83
|
+
service_init(service_name, application_context)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def log (event, *args)
|
|
87
|
+
|
|
88
|
+
return if event == :update
|
|
89
|
+
return if event == :reschedule
|
|
90
|
+
return if event == :stop
|
|
91
|
+
|
|
92
|
+
msg = "#{Time.now.to_s} -- "
|
|
93
|
+
|
|
94
|
+
msg << event.to_s
|
|
95
|
+
|
|
96
|
+
if args.length > 0
|
|
97
|
+
fei = extract_fei args[0]
|
|
98
|
+
msg << " #{fei.to_s}"
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
#msg << " #{args[1].to_s}" \
|
|
102
|
+
# if args.length > 1
|
|
103
|
+
|
|
104
|
+
@output << msg + "\n"
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
#
|
|
109
|
+
# The simplest implementation, stores all history entries in memory.
|
|
110
|
+
#
|
|
111
|
+
# DO NOT USE IN PRODUCTION, it will trigger an 'out of memory' error
|
|
112
|
+
# sooner or later.
|
|
113
|
+
#
|
|
114
|
+
# Is only used for unit testing purposes.
|
|
115
|
+
#
|
|
116
|
+
class InMemoryHistory < BaseHistory
|
|
117
|
+
|
|
118
|
+
def initialize (service_name, application_context)
|
|
119
|
+
super
|
|
120
|
+
|
|
121
|
+
@output = []
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
#
|
|
125
|
+
# Returns the array of entries.
|
|
126
|
+
#
|
|
127
|
+
def entries
|
|
128
|
+
@output
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
#
|
|
132
|
+
# Returns all the entries as a String.
|
|
133
|
+
#
|
|
134
|
+
def to_s
|
|
135
|
+
s = ""
|
|
136
|
+
@output.each do |entry|
|
|
137
|
+
s << entry.to_s
|
|
138
|
+
end
|
|
139
|
+
s
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
#
|
|
144
|
+
# Simply dumps the history in the work directory in a file named
|
|
145
|
+
# "history.log"
|
|
146
|
+
# Warning : no fancy rotation or compression implemented here.
|
|
147
|
+
#
|
|
148
|
+
class FileHistory < BaseHistory
|
|
149
|
+
|
|
150
|
+
def initialize (service_name, application_context)
|
|
151
|
+
|
|
152
|
+
super
|
|
153
|
+
|
|
154
|
+
@output = get_work_directory + "/history.log"
|
|
155
|
+
@output = File.open(@output, "w+")
|
|
156
|
+
|
|
157
|
+
linfo { "new() outputting history to #{@output.path}" }
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
#
|
|
161
|
+
# Returns a handle on the output file instance used by this
|
|
162
|
+
# FileHistory.
|
|
163
|
+
#
|
|
164
|
+
def output_file
|
|
165
|
+
@output
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def stop
|
|
169
|
+
@output.close
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
end
|
|
174
|
+
|