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,130 @@
|
|
|
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
|
+
|
|
38
|
+
require 'fileutils'
|
|
39
|
+
|
|
40
|
+
require 'openwfe/utils'
|
|
41
|
+
require 'openwfe/version'
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
module OpenWFE
|
|
45
|
+
|
|
46
|
+
#
|
|
47
|
+
# service names
|
|
48
|
+
|
|
49
|
+
S_LOGGER = :logger
|
|
50
|
+
|
|
51
|
+
S_ENGINE = 'engine'
|
|
52
|
+
S_EXPRESSION_MAP = 'expressionMap'
|
|
53
|
+
S_WFID_GENERATOR = 'wfidGenerator'
|
|
54
|
+
S_WORKQUEUE = 'workQueue'
|
|
55
|
+
S_EXPRESSION_POOL = 'expressionPool'
|
|
56
|
+
S_EXPRESSION_STORAGE = 'expressionStorage'
|
|
57
|
+
S_PARTICIPANT_MAP = 'participantMap'
|
|
58
|
+
S_SCHEDULER = 'scheduler'
|
|
59
|
+
S_ERROR_JOURNAL = 'errorJournal'
|
|
60
|
+
|
|
61
|
+
#
|
|
62
|
+
# some special expression names
|
|
63
|
+
|
|
64
|
+
EN_ENVIRONMENT = 'environment'
|
|
65
|
+
|
|
66
|
+
#
|
|
67
|
+
# some file storage default values
|
|
68
|
+
|
|
69
|
+
DEFAULT_WORK_DIRECTORY = 'work'
|
|
70
|
+
|
|
71
|
+
#
|
|
72
|
+
# A mixin for easy OpenWFE service lookup
|
|
73
|
+
# (assumes the presence of an application context instance var)
|
|
74
|
+
#
|
|
75
|
+
module OwfeServiceLocator
|
|
76
|
+
|
|
77
|
+
def get_engine
|
|
78
|
+
@application_context[S_ENGINE]
|
|
79
|
+
end
|
|
80
|
+
def get_scheduler
|
|
81
|
+
@application_context[S_SCHEDULER]
|
|
82
|
+
end
|
|
83
|
+
def get_expression_map
|
|
84
|
+
@application_context[S_EXPRESSION_MAP]
|
|
85
|
+
end
|
|
86
|
+
def get_wfid_generator
|
|
87
|
+
@application_context[S_WFID_GENERATOR]
|
|
88
|
+
end
|
|
89
|
+
def get_workqueue
|
|
90
|
+
@application_context[S_WORKQUEUE]
|
|
91
|
+
end
|
|
92
|
+
def get_expool
|
|
93
|
+
@application_context[S_EXPRESSION_POOL]
|
|
94
|
+
end
|
|
95
|
+
def get_expression_pool
|
|
96
|
+
@application_context[S_EXPRESSION_POOL]
|
|
97
|
+
end
|
|
98
|
+
def get_expression_storage
|
|
99
|
+
@application_context[S_EXPRESSION_STORAGE]
|
|
100
|
+
end
|
|
101
|
+
def get_participant_map
|
|
102
|
+
@application_context[S_PARTICIPANT_MAP]
|
|
103
|
+
end
|
|
104
|
+
def get_error_journal
|
|
105
|
+
@application_context[S_ERROR_JOURNAL]
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
#
|
|
109
|
+
# Returns the 'journal' service (or nil if there is no
|
|
110
|
+
# journal service available).
|
|
111
|
+
#
|
|
112
|
+
def get_journal
|
|
113
|
+
@application_context['journal']
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
#
|
|
117
|
+
# Returns all the expression storage in the application context
|
|
118
|
+
# (there is usually a cache and a persisted exp storage).
|
|
119
|
+
#
|
|
120
|
+
def get_expression_storages
|
|
121
|
+
|
|
122
|
+
@application_context.inject([]) do |r, (k, v)|
|
|
123
|
+
r << v if OpenWFE::starts_with(k.to_s, S_EXPRESSION_STORAGE)
|
|
124
|
+
r
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
end
|
|
130
|
+
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
#
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 2006-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 'openwfe/logging'
|
|
41
|
+
require 'openwfe/contextual'
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
module OpenWFE
|
|
45
|
+
|
|
46
|
+
#
|
|
47
|
+
# Most of the functionalities of an OpenWFEru service are implemented
|
|
48
|
+
# here as a mixin. It's then easy to either extend Service or include
|
|
49
|
+
# ServiceMixin, to compose an OpenWFEru service class.
|
|
50
|
+
#
|
|
51
|
+
module ServiceMixin
|
|
52
|
+
include Contextual
|
|
53
|
+
include Logging
|
|
54
|
+
|
|
55
|
+
#
|
|
56
|
+
# The name of the service
|
|
57
|
+
#
|
|
58
|
+
attr_accessor :service_name
|
|
59
|
+
|
|
60
|
+
#
|
|
61
|
+
# Inits the service by setting the service name and the application
|
|
62
|
+
# context. Does also bind the service under the service name in the
|
|
63
|
+
# application context.
|
|
64
|
+
#
|
|
65
|
+
def service_init (service_name, application_context)
|
|
66
|
+
|
|
67
|
+
@service_name = service_name
|
|
68
|
+
@application_context = application_context
|
|
69
|
+
|
|
70
|
+
@application_context[@service_name.to_s] = self \
|
|
71
|
+
if @service_name and @application_context
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
#
|
|
75
|
+
# Some services (like the scheduler one for example) need to
|
|
76
|
+
# free some resources upon stopping. This can be achieved by
|
|
77
|
+
# overwriting this method.
|
|
78
|
+
#
|
|
79
|
+
def stop
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
#
|
|
84
|
+
# A service has a service_name and a link to its application_context.
|
|
85
|
+
# Via the application_context, it can lookup other services (if it
|
|
86
|
+
# knows their names).
|
|
87
|
+
#
|
|
88
|
+
class Service
|
|
89
|
+
include ServiceMixin
|
|
90
|
+
|
|
91
|
+
def initialize (service_name, application_context)
|
|
92
|
+
|
|
93
|
+
service_init service_name, application_context
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
#def register (service)
|
|
98
|
+
# service.application_context[service.service_name] = service
|
|
99
|
+
# return service
|
|
100
|
+
#end
|
|
101
|
+
|
|
102
|
+
end
|
|
103
|
+
|
|
@@ -0,0 +1,106 @@
|
|
|
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
|
+
|
|
42
|
+
|
|
43
|
+
module OpenWFE
|
|
44
|
+
|
|
45
|
+
#
|
|
46
|
+
# reopening some classes in order to facilitate their
|
|
47
|
+
# yaml serialization
|
|
48
|
+
#
|
|
49
|
+
|
|
50
|
+
#
|
|
51
|
+
# opening for tuning yaml persistence
|
|
52
|
+
#
|
|
53
|
+
class FlowExpression
|
|
54
|
+
|
|
55
|
+
def to_yaml_properties
|
|
56
|
+
|
|
57
|
+
l = super
|
|
58
|
+
|
|
59
|
+
l.delete("@application_context")
|
|
60
|
+
|
|
61
|
+
#l.delete("@timeout_job_id")
|
|
62
|
+
#l.delete("@scheduler_job_id")
|
|
63
|
+
# scheduler ids should not get persisted
|
|
64
|
+
|
|
65
|
+
l
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
#
|
|
70
|
+
# making sure that the FlowExpressionId is serialized as a unique String
|
|
71
|
+
#
|
|
72
|
+
class FlowExpressionId
|
|
73
|
+
|
|
74
|
+
yaml_as "tag:ruby.yaml.org,2002:#{self}"
|
|
75
|
+
|
|
76
|
+
#--
|
|
77
|
+
#def to_yaml (opts={})
|
|
78
|
+
# @s = to_s
|
|
79
|
+
# super
|
|
80
|
+
#end
|
|
81
|
+
#def to_yaml_properties
|
|
82
|
+
# [ "@s" ]
|
|
83
|
+
#end
|
|
84
|
+
#++
|
|
85
|
+
|
|
86
|
+
def to_yaml (opts={})
|
|
87
|
+
|
|
88
|
+
YAML::quick_emit(self.object_id, opts) do |out|
|
|
89
|
+
out.map(taguri) do |map|
|
|
90
|
+
map.add "s", to_s
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def FlowExpressionId.yaml_new (klass, tag, val)
|
|
96
|
+
|
|
97
|
+
s = val["s"]
|
|
98
|
+
begin
|
|
99
|
+
FlowExpressionId.to_fei s
|
|
100
|
+
rescue Exception => e
|
|
101
|
+
raise "failed to decode FlowExpressionId out of '#{s}'"
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
@@ -0,0 +1,245 @@
|
|
|
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 'find'
|
|
42
|
+
require 'yaml'
|
|
43
|
+
require 'monitor'
|
|
44
|
+
require 'fileutils'
|
|
45
|
+
|
|
46
|
+
require 'openwfe/utils'
|
|
47
|
+
require 'openwfe/service'
|
|
48
|
+
|
|
49
|
+
require 'openwfe/expressions/flowexpression'
|
|
50
|
+
#--
|
|
51
|
+
# making sure classes in those files are loaded
|
|
52
|
+
# before their yaml persistence is tuned
|
|
53
|
+
# (else the reopening of the class is interpreted as
|
|
54
|
+
# a definition of the class...)
|
|
55
|
+
#++
|
|
56
|
+
|
|
57
|
+
module OpenWFE
|
|
58
|
+
|
|
59
|
+
#
|
|
60
|
+
# Stores OpenWFEru related objects into yaml encoded files.
|
|
61
|
+
# This storage is meant to look and feel like a Hash.
|
|
62
|
+
#
|
|
63
|
+
class YamlFileStorage
|
|
64
|
+
include ServiceMixin
|
|
65
|
+
include MonitorMixin
|
|
66
|
+
|
|
67
|
+
#
|
|
68
|
+
# The root path for this file persistence mecha.
|
|
69
|
+
#
|
|
70
|
+
attr_accessor :basepath
|
|
71
|
+
|
|
72
|
+
def initialize (service_name, application_context, path)
|
|
73
|
+
|
|
74
|
+
super()
|
|
75
|
+
|
|
76
|
+
service_init(service_name, application_context)
|
|
77
|
+
|
|
78
|
+
@basepath = get_work_directory + path
|
|
79
|
+
@basepath += "/" unless @basepath[-1, 1] == "/"
|
|
80
|
+
|
|
81
|
+
FileUtils.makedirs @basepath
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
#
|
|
85
|
+
# Stores an object with its FlowExpressionId instance as its key.
|
|
86
|
+
#
|
|
87
|
+
def []= (fei, object)
|
|
88
|
+
synchronize do
|
|
89
|
+
|
|
90
|
+
#linfo { "[]= #{fei}" }
|
|
91
|
+
|
|
92
|
+
fei_path = compute_file_path fei
|
|
93
|
+
|
|
94
|
+
fei_parent_path = File.dirname fei_path
|
|
95
|
+
|
|
96
|
+
FileUtils.makedirs(fei_parent_path) \
|
|
97
|
+
unless File.exist?(fei_parent_path)
|
|
98
|
+
|
|
99
|
+
File.open(fei_path, "w") do |file|
|
|
100
|
+
YAML.dump object, file
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
#
|
|
106
|
+
# Deletes the whole storage directory... beware...
|
|
107
|
+
#
|
|
108
|
+
def purge
|
|
109
|
+
synchronize do
|
|
110
|
+
|
|
111
|
+
FileUtils.remove_dir @basepath
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
#
|
|
116
|
+
# Checks whether there is an object (expression, workitem) stored
|
|
117
|
+
# for the given FlowExpressionId instance.
|
|
118
|
+
#
|
|
119
|
+
def has_key? (fei)
|
|
120
|
+
|
|
121
|
+
File.exist?(compute_file_path(fei))
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
#
|
|
125
|
+
# Removes the object (file) stored for the given FlowExpressionId
|
|
126
|
+
# instance.
|
|
127
|
+
#
|
|
128
|
+
def delete (fei)
|
|
129
|
+
synchronize do
|
|
130
|
+
|
|
131
|
+
fei_path = compute_file_path fei
|
|
132
|
+
|
|
133
|
+
ldebug { "delete()\n for #{fei.to_debug_s}\n at #{fei_path}" }
|
|
134
|
+
|
|
135
|
+
File.delete fei_path
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
#
|
|
140
|
+
# Actually loads and returns the object for the given
|
|
141
|
+
# FlowExpressionId instance.
|
|
142
|
+
#
|
|
143
|
+
def [] (fei)
|
|
144
|
+
|
|
145
|
+
fei_path = compute_file_path(fei)
|
|
146
|
+
|
|
147
|
+
if not File.exist?(fei_path)
|
|
148
|
+
|
|
149
|
+
ldebug { "[] didn't find file at #{fei_path}" }
|
|
150
|
+
#puts "[] didn't find file at #{fei_path}"
|
|
151
|
+
|
|
152
|
+
return nil
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
load_object(fei_path)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
#
|
|
159
|
+
# Returns the count of objects currently stored in this instance.
|
|
160
|
+
#
|
|
161
|
+
def length
|
|
162
|
+
|
|
163
|
+
count_objects()
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
alias :size :length
|
|
167
|
+
|
|
168
|
+
protected
|
|
169
|
+
|
|
170
|
+
def load_object (path)
|
|
171
|
+
|
|
172
|
+
object = YAML.load_file(path)
|
|
173
|
+
|
|
174
|
+
object.application_context = @application_context \
|
|
175
|
+
if object.respond_to? :application_context=
|
|
176
|
+
|
|
177
|
+
object
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
#
|
|
181
|
+
# Returns the number of 'objects' currently in this storage.
|
|
182
|
+
#
|
|
183
|
+
def count_objects
|
|
184
|
+
|
|
185
|
+
count = 0
|
|
186
|
+
|
|
187
|
+
Find.find(@basepath) do |path|
|
|
188
|
+
|
|
189
|
+
next unless File.exist? path
|
|
190
|
+
next if File.stat(path).directory?
|
|
191
|
+
|
|
192
|
+
count += 1 if OpenWFE::ends_with(path, ".yaml")
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
count
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
#
|
|
199
|
+
# Passes each object path to the given block
|
|
200
|
+
#
|
|
201
|
+
def each_object_path (path=@basepath, &block)
|
|
202
|
+
synchronize do
|
|
203
|
+
|
|
204
|
+
Find.find(path) do |p|
|
|
205
|
+
|
|
206
|
+
next unless File.exist?(p)
|
|
207
|
+
next if File.stat(p).directory?
|
|
208
|
+
next unless OpenWFE::ends_with(p, ".yaml")
|
|
209
|
+
|
|
210
|
+
ldebug { "each_object_path() considering #{p}" }
|
|
211
|
+
block.call p
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
#
|
|
217
|
+
# Passes each object to the given block
|
|
218
|
+
#
|
|
219
|
+
def each_object (&block)
|
|
220
|
+
|
|
221
|
+
each_object_path do |path|
|
|
222
|
+
block.call load_object(path)
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
#
|
|
227
|
+
# each_value() is a method from Hash, by providing it here
|
|
228
|
+
# it's easier to disguise a YamlFileStorage as a hash.
|
|
229
|
+
#
|
|
230
|
+
alias :each_value :each_object
|
|
231
|
+
|
|
232
|
+
protected
|
|
233
|
+
|
|
234
|
+
#
|
|
235
|
+
# Each object is meant to have a unique file path,
|
|
236
|
+
# this method wraps the determination of that path. It has to
|
|
237
|
+
# be provided by extending classes.
|
|
238
|
+
#
|
|
239
|
+
def compute_file_path (object)
|
|
240
|
+
raise NotImplementedError.new
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
end
|