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,129 @@
|
|
|
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
|
+
# $Id: definitions.rb 2725 2006-06-02 13:26:32Z jmettraux $
|
|
34
|
+
#
|
|
35
|
+
|
|
36
|
+
#
|
|
37
|
+
# "made in Japan"
|
|
38
|
+
#
|
|
39
|
+
# John Mettraux at openwfe.org
|
|
40
|
+
#
|
|
41
|
+
|
|
42
|
+
require 'openwfe/expressions/filter'
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
module OpenWFE
|
|
46
|
+
|
|
47
|
+
#
|
|
48
|
+
# This expression applies a filter to the workitem used by the process
|
|
49
|
+
# segment nested within it.
|
|
50
|
+
#
|
|
51
|
+
# class TestFilter48a0 < ProcessDefinition
|
|
52
|
+
# sequence do
|
|
53
|
+
#
|
|
54
|
+
# set :field => "readable", :value => "bible"
|
|
55
|
+
# set :field => "writable", :value => "sand"
|
|
56
|
+
# set :field => "randw", :value => "notebook"
|
|
57
|
+
# set :field => "hidden", :value => "playboy"
|
|
58
|
+
#
|
|
59
|
+
# alice
|
|
60
|
+
#
|
|
61
|
+
# filter :name => "filter0" do
|
|
62
|
+
# sequence do
|
|
63
|
+
# bob
|
|
64
|
+
# charly
|
|
65
|
+
# end
|
|
66
|
+
# end
|
|
67
|
+
#
|
|
68
|
+
# doug
|
|
69
|
+
# end
|
|
70
|
+
#
|
|
71
|
+
# filter_definition :name => "filter0" do
|
|
72
|
+
# field :regex => "readable", :permissions => "r"
|
|
73
|
+
# field :regex => "writable", :permissions => "w"
|
|
74
|
+
# field :regex => "randw", :permissions => "rw"
|
|
75
|
+
# field :regex => "hidden", :permissions => ""
|
|
76
|
+
# end
|
|
77
|
+
# end
|
|
78
|
+
#
|
|
79
|
+
# In this example, the filter 'filter0' is applied upon entering bob and
|
|
80
|
+
# charly's sequence.
|
|
81
|
+
#
|
|
82
|
+
# Please note that the filter will not be enforced between bob and charly,
|
|
83
|
+
# it is enforced just before entering the sequence and just after leaving
|
|
84
|
+
# it.
|
|
85
|
+
#
|
|
86
|
+
# Note also that the ParticipantExpression accepts a 'filter' attribute,
|
|
87
|
+
# thus :
|
|
88
|
+
#
|
|
89
|
+
# <filter name="filter0">
|
|
90
|
+
# <participant ref="toto" />
|
|
91
|
+
# </filter>
|
|
92
|
+
#
|
|
93
|
+
# can be simplified to :
|
|
94
|
+
#
|
|
95
|
+
# <participant ref="toto" filter="filter0" />
|
|
96
|
+
#
|
|
97
|
+
class FilterExpression < FlowExpression
|
|
98
|
+
include FilterMixin
|
|
99
|
+
|
|
100
|
+
names :filter
|
|
101
|
+
|
|
102
|
+
attr_accessor :applied_workitem, :filter
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def apply workitem
|
|
106
|
+
|
|
107
|
+
if @children.length < 1
|
|
108
|
+
reply_to_parent workitem
|
|
109
|
+
return
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
@applied_workitem = workitem.dup
|
|
113
|
+
filter_in workitem, :name
|
|
114
|
+
|
|
115
|
+
store_itself
|
|
116
|
+
|
|
117
|
+
get_expression_pool.apply @children[0], workitem
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def reply workitem
|
|
121
|
+
|
|
122
|
+
filter_out workitem
|
|
123
|
+
|
|
124
|
+
reply_to_parent workitem
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
end
|
|
129
|
+
|
|
@@ -0,0 +1,168 @@
|
|
|
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 'openwfe/filterdef'
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
module OpenWFE
|
|
44
|
+
|
|
45
|
+
#
|
|
46
|
+
# This expression binds a filter definition into a variable.
|
|
47
|
+
#
|
|
48
|
+
# class TestFilter48a0 < ProcessDefinition
|
|
49
|
+
# sequence do
|
|
50
|
+
#
|
|
51
|
+
# set :field => "readable", :value => "bible"
|
|
52
|
+
# set :field => "writable", :value => "sand"
|
|
53
|
+
# set :field => "randw", :value => "notebook"
|
|
54
|
+
# set :field => "hidden", :value => "playboy"
|
|
55
|
+
#
|
|
56
|
+
# alice
|
|
57
|
+
#
|
|
58
|
+
# filter :name => "filter0" do
|
|
59
|
+
# sequence do
|
|
60
|
+
# bob
|
|
61
|
+
# charly
|
|
62
|
+
# end
|
|
63
|
+
# end
|
|
64
|
+
#
|
|
65
|
+
# doug
|
|
66
|
+
# end
|
|
67
|
+
#
|
|
68
|
+
# filter_definition :name => "filter0" do
|
|
69
|
+
# field :regex => "readable", :permissions => "r"
|
|
70
|
+
# field :regex => "writable", :permissions => "w"
|
|
71
|
+
# field :regex => "randw", :permissions => "rw"
|
|
72
|
+
# field :regex => "hidden", :permissions => ""
|
|
73
|
+
# end
|
|
74
|
+
# end
|
|
75
|
+
#
|
|
76
|
+
# In that example, the filter definition is done for filter 'filter0'.
|
|
77
|
+
#
|
|
78
|
+
# A filter definition accepts 4 attributes :
|
|
79
|
+
#
|
|
80
|
+
# * 'name' - simply naming the filter, the filter is then bound as a variable. This is the only mandatory attribute.
|
|
81
|
+
#
|
|
82
|
+
# * 'closed' - by default, set to 'false'. A closed filter will not allow modifications to unspecified fields.
|
|
83
|
+
#
|
|
84
|
+
# * 'add' - by default, set to 'true'. When true, this filter accepts adding new fields to the filtered workitem.
|
|
85
|
+
#
|
|
86
|
+
# * 'remove' - by default, set to 'true'. When true, this filter accepts removing fields to the filtered workitem.
|
|
87
|
+
#
|
|
88
|
+
#
|
|
89
|
+
# Inside of the process definition, fields are identified via regular
|
|
90
|
+
# expressions ('regex'), a 'permissions' string is then expected with four
|
|
91
|
+
# possible values "rw", "w", "r" and "".
|
|
92
|
+
#
|
|
93
|
+
class FilterDefinitionExpression < FlowExpression
|
|
94
|
+
|
|
95
|
+
is_definition
|
|
96
|
+
|
|
97
|
+
names :filter_definition
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
#
|
|
101
|
+
# Will build the filter and bind it as a variable.
|
|
102
|
+
#
|
|
103
|
+
def apply (workitem)
|
|
104
|
+
|
|
105
|
+
filter = build_filter workitem
|
|
106
|
+
filter_name = lookup_attribute :name, workitem
|
|
107
|
+
|
|
108
|
+
set_variable filter_name, filter \
|
|
109
|
+
if filter_name and filter
|
|
110
|
+
|
|
111
|
+
reply_to_parent workitem
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
protected
|
|
115
|
+
|
|
116
|
+
#
|
|
117
|
+
# Builds the filter (as described in the process definition)
|
|
118
|
+
# and returns it.
|
|
119
|
+
#
|
|
120
|
+
def build_filter (workitem)
|
|
121
|
+
|
|
122
|
+
filter = FilterDefinition.new
|
|
123
|
+
|
|
124
|
+
# filter attributes
|
|
125
|
+
|
|
126
|
+
type = lookup_downcase_attribute :type, workitem
|
|
127
|
+
closed = lookup_downcase_attribute :closed, workitem
|
|
128
|
+
|
|
129
|
+
filter.closed = (type == "closed" or closed == "true")
|
|
130
|
+
|
|
131
|
+
add = lookup_downcase_attribute :add, workitem
|
|
132
|
+
remove = lookup_downcase_attribute :remove, workitem
|
|
133
|
+
|
|
134
|
+
filter.add_allowed = (add == "true")
|
|
135
|
+
filter.remove_allowed = (remove == "true")
|
|
136
|
+
|
|
137
|
+
# field by field
|
|
138
|
+
|
|
139
|
+
@children.each do |fei|
|
|
140
|
+
|
|
141
|
+
rawexp = get_expression_pool.fetch_expression fei
|
|
142
|
+
get_expression_pool.remove fei
|
|
143
|
+
|
|
144
|
+
add_field filter, rawexp, workitem
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
filter
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
#
|
|
151
|
+
# builds and add a field (a line) of the filter.
|
|
152
|
+
#
|
|
153
|
+
def add_field (filter, rawexp, workitem)
|
|
154
|
+
|
|
155
|
+
rawexp.load_attributes
|
|
156
|
+
|
|
157
|
+
regex = rawexp.lookup_attribute :regex, workitem
|
|
158
|
+
regex = rawexp.lookup_attribute :name, workitem unless regex
|
|
159
|
+
|
|
160
|
+
permissions =
|
|
161
|
+
rawexp.lookup_downcase_attribute :permissions, workitem
|
|
162
|
+
|
|
163
|
+
filter.add_field regex, permissions
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
end
|
|
168
|
+
|
|
@@ -0,0 +1,250 @@
|
|
|
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 'json' # gem 'json_pure'
|
|
41
|
+
|
|
42
|
+
require 'openwfe/util/xml'
|
|
43
|
+
require 'openwfe/expressions/flowexpression'
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
#
|
|
47
|
+
# 'f', 'q' and 'v' expressions
|
|
48
|
+
#
|
|
49
|
+
# 'a' as well
|
|
50
|
+
#
|
|
51
|
+
|
|
52
|
+
module OpenWFE
|
|
53
|
+
|
|
54
|
+
#
|
|
55
|
+
# This expression implementation gathers the 'f', 'q' and 'v' expressions,
|
|
56
|
+
# along with their fullname 'field', 'variable' and 'quote'.
|
|
57
|
+
#
|
|
58
|
+
# These expressions place the value of the corresponding, field, variable
|
|
59
|
+
# or quoted (direct value) in the 'result' field of the current workitem.
|
|
60
|
+
#
|
|
61
|
+
# sequence do
|
|
62
|
+
#
|
|
63
|
+
# set :field => "f0", :value => "fox"
|
|
64
|
+
# set :variable => "v0", :value => "vixen"
|
|
65
|
+
#
|
|
66
|
+
# set :field => "f1" do
|
|
67
|
+
# v "v0"
|
|
68
|
+
# end
|
|
69
|
+
# set :variable => "v1" do
|
|
70
|
+
# f "f0"
|
|
71
|
+
# end
|
|
72
|
+
# set :variable => "v2" do
|
|
73
|
+
# f "f0"
|
|
74
|
+
# end
|
|
75
|
+
# end
|
|
76
|
+
#
|
|
77
|
+
# Well, this is perhaps not the best example.
|
|
78
|
+
#
|
|
79
|
+
class FqvExpression < FlowExpression
|
|
80
|
+
|
|
81
|
+
names :f, :q, :v, :field, :quote, :variable
|
|
82
|
+
|
|
83
|
+
#
|
|
84
|
+
# apply / reply
|
|
85
|
+
|
|
86
|
+
def apply (workitem)
|
|
87
|
+
|
|
88
|
+
name = @fei.expression_name[0, 1]
|
|
89
|
+
text = fetch_text_content workitem
|
|
90
|
+
|
|
91
|
+
method = MAP[name]
|
|
92
|
+
|
|
93
|
+
result = self.send method, text, workitem
|
|
94
|
+
|
|
95
|
+
workitem.set_result(result) if result != nil
|
|
96
|
+
|
|
97
|
+
reply_to_parent workitem
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
protected
|
|
101
|
+
|
|
102
|
+
MAP = {
|
|
103
|
+
"f" => :field,
|
|
104
|
+
"q" => :quote,
|
|
105
|
+
"v" => :variable
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
def field (text, workitem)
|
|
109
|
+
workitem.attributes[text]
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def quote (text, workitem)
|
|
113
|
+
text
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def variable (text, workitem)
|
|
117
|
+
self.lookup_variable(text)
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
#
|
|
122
|
+
# The 'a' or 'attribute' expression. Directly describing some
|
|
123
|
+
# variable or list content in XML or in YAML.
|
|
124
|
+
#
|
|
125
|
+
# _set :field => "list" do
|
|
126
|
+
# _a """
|
|
127
|
+
# <array>
|
|
128
|
+
# <string>a</string>
|
|
129
|
+
# <string>b</string>
|
|
130
|
+
# <number>3</number>
|
|
131
|
+
# <string>d</string>
|
|
132
|
+
# <null/>
|
|
133
|
+
# <false/>
|
|
134
|
+
# <string>it's over</string>
|
|
135
|
+
# </array>
|
|
136
|
+
# """
|
|
137
|
+
# end
|
|
138
|
+
#
|
|
139
|
+
# or
|
|
140
|
+
#
|
|
141
|
+
# _set :field => "list" do
|
|
142
|
+
# _attribute """
|
|
143
|
+
# ---
|
|
144
|
+
# - a
|
|
145
|
+
# - b
|
|
146
|
+
# - c
|
|
147
|
+
# """
|
|
148
|
+
# end
|
|
149
|
+
#
|
|
150
|
+
# Note that it's actually easier to write :
|
|
151
|
+
#
|
|
152
|
+
# _set :field => "list" do
|
|
153
|
+
# reval "[ 'a', 'b', 'c' ]"
|
|
154
|
+
# end
|
|
155
|
+
#
|
|
156
|
+
# but it's less secure. The best way might be :
|
|
157
|
+
#
|
|
158
|
+
# set :field => "list", :value => [ 'a', 'b', 'c' ]
|
|
159
|
+
#
|
|
160
|
+
# Yet another way, as this <a> expression accepts JSON :
|
|
161
|
+
#
|
|
162
|
+
# set :field => 'list' do
|
|
163
|
+
# a '[1,2,false,"my name"]'
|
|
164
|
+
# end
|
|
165
|
+
#
|
|
166
|
+
#
|
|
167
|
+
class AttributeExpression < FlowExpression
|
|
168
|
+
|
|
169
|
+
names :a, :attribute
|
|
170
|
+
|
|
171
|
+
XML_REGEX = /<.*>/
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def apply (workitem)
|
|
175
|
+
|
|
176
|
+
child = @children.first
|
|
177
|
+
|
|
178
|
+
text = if child.is_a?(String)
|
|
179
|
+
|
|
180
|
+
child
|
|
181
|
+
|
|
182
|
+
elsif child.is_a?(FlowExpressionId)
|
|
183
|
+
|
|
184
|
+
exp = get_expression_pool.fetch_expression child
|
|
185
|
+
ExpressionTree.to_s exp.raw_representation
|
|
186
|
+
|
|
187
|
+
else
|
|
188
|
+
|
|
189
|
+
child.to_s
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
text = text.strip
|
|
193
|
+
|
|
194
|
+
result = if text[0, 3] == '---'
|
|
195
|
+
|
|
196
|
+
from_yaml text
|
|
197
|
+
|
|
198
|
+
elsif text.match(XML_REGEX)
|
|
199
|
+
|
|
200
|
+
from_xml text
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
result = from_json(text) if result == nil
|
|
204
|
+
|
|
205
|
+
workitem.set_result(result) if result != nil
|
|
206
|
+
|
|
207
|
+
reply_to_parent workitem
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
protected
|
|
211
|
+
|
|
212
|
+
def from_yaml (text)
|
|
213
|
+
|
|
214
|
+
begin
|
|
215
|
+
|
|
216
|
+
YAML.load text
|
|
217
|
+
|
|
218
|
+
rescue Exception => e
|
|
219
|
+
linfo { "from_yaml() failed : #{e}" }
|
|
220
|
+
nil
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def from_xml (text)
|
|
225
|
+
|
|
226
|
+
begin
|
|
227
|
+
|
|
228
|
+
OpenWFE::Xml.from_xml text
|
|
229
|
+
|
|
230
|
+
rescue Exception => e
|
|
231
|
+
linfo { "from_xml() failed : #{e}" }
|
|
232
|
+
nil
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
def from_json (text)
|
|
237
|
+
|
|
238
|
+
begin
|
|
239
|
+
|
|
240
|
+
JSON.parse text
|
|
241
|
+
|
|
242
|
+
rescue Exception => e
|
|
243
|
+
linfo { "from_json() failed : #{e}" }
|
|
244
|
+
nil
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
end
|
|
250
|
+
|