cpee 2.1.26 → 2.1.32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/cockpit/templates/Frames.xml +297 -0
- data/cockpit/templates/Subprocess.xml +79 -0
- data/cockpit/templates/Subprocess.xml.attrs +13 -0
- data/cockpit/templates/Track Test.xml +31 -28
- data/cockpit/templates/Track Test.xml.attrs +11 -0
- data/cockpit/templates/Wait.xml +73 -0
- data/cockpit/templates/Wait.xml.attrs +13 -0
- data/cockpit/templates/Worklist.xml +58 -26
- data/cockpit/templates/instantiate/Take_Perf.xml +13 -10
- data/cockpit/templates/instantiate/Take_Sub.xml +4 -8
- data/cockpit/templates/instantiate/Take_X.xml +12 -9
- data/cockpit/themes/compact/theme.js +1 -1
- data/cockpit/themes/control/theme.js +1 -1
- data/cockpit/themes/default/theme.js +1 -1
- data/cockpit/themes/extended/theme.js +1 -1
- data/cockpit/themes/model/theme.js +1 -1
- data/cockpit/themes/packed/theme.js +1 -1
- data/cockpit/themes/preset/theme.js +1 -1
- data/cpee.gemspec +1 -1
- data/lib/cpee/fail.rb +23 -0
- data/lib/cpee/implementation.rb +34 -18
- data/lib/cpee/implementation_callbacks.rb +20 -15
- data/lib/cpee/implementation_notifications.rb +22 -17
- data/lib/cpee/implementation_properties.rb +66 -61
- data/lib/cpee/message.rb +15 -13
- data/lib/cpee/persistence.rb +33 -10
- data/server/executionhandlers/ruby/connection.rb +15 -5
- data/server/executionhandlers/ruby/controller.rb +11 -6
- data/server/executionhandlers/ruby/dsl_to_dslx.xsl +36 -6
- data/server/routing/end.pid +1 -0
- data/server/routing/forward-events.pid +1 -0
- data/server/routing/forward-events.rb +6 -0
- data/server/routing/forward-votes.pid +1 -0
- data/server/routing/persist.pid +1 -0
- data/server/routing/persist.rb +4 -2
- data/server/server.conf +1 -1
- metadata +13 -6
- data/cockpit/templates/Coopis 2010.xml.active +0 -1
- data/cockpit/templates/Coopis 2010.xml.active-uuid +0 -1
- data/cockpit/templates/UR-VUE 2020 Solution Baseline.xml.active +0 -1
- data/cockpit/templates/UR-VUE 2020 Solution Baseline.xml.active-uuid +0 -1
@@ -1,33 +1,75 @@
|
|
1
|
+
<?xml version="1.0"?>
|
1
2
|
<testset xmlns="http://cpee.org/ns/properties/2.0">
|
2
3
|
<executionhandler>ruby</executionhandler>
|
3
|
-
<dataelements
|
4
|
-
<bla/>
|
5
|
-
</dataelements>
|
4
|
+
<dataelements/>
|
6
5
|
<endpoints>
|
7
6
|
<timeout>http://gruppe.wst.univie.ac.at/~mangler/services/timeout.php</timeout>
|
8
|
-
<
|
7
|
+
<subprocess>https-post://cpee.org/flow/start/url/</subprocess>
|
8
|
+
<worklist>https-post://cpee.org/worklist/server/</worklist>
|
9
|
+
<send>https-post://cpee.org/ing/correlators/message/send/</send>
|
10
|
+
<receive>https-get://cpee.org/ing/correlators/message/receive/</receive>
|
11
|
+
<user>https-post://cpee.org/services/timeout-user.php</user>
|
12
|
+
<auto>https-post://cpee.org/services/timeout-auto.php</auto>
|
9
13
|
</endpoints>
|
10
|
-
<
|
14
|
+
<attributes>
|
15
|
+
<info>Worklist</info>
|
16
|
+
<modeltype>CPEE</modeltype>
|
17
|
+
<organisation1>http://cpee.org/~demo/orgviz/organisation_informatik.xml</organisation1>
|
18
|
+
<theme>extended</theme>
|
19
|
+
<creator>Christine Ashcreek</creator>
|
20
|
+
<author>Christine Ashcreek</author>
|
21
|
+
<design_stage>development</design_stage>
|
22
|
+
<design_dir>Templates.dir</design_dir>
|
23
|
+
</attributes>
|
11
24
|
<description>
|
12
25
|
<description xmlns="http://cpee.org/ns/description/1.0">
|
13
26
|
<call id="a1" endpoint="worklist">
|
14
27
|
<parameters>
|
15
28
|
<label>OK OR NOT OK</label>
|
16
|
-
<method>:post</method>
|
17
29
|
<arguments>
|
18
|
-
<orgmodel>
|
19
|
-
<domain>
|
20
|
-
<form>
|
21
|
-
<role>
|
22
|
-
<
|
23
|
-
|
30
|
+
<orgmodel>https://cpee.org/~demo/orgviz/organisation_informatik.xml</orgmodel>
|
31
|
+
<domain>VirtualBusiness1</domain>
|
32
|
+
<form>https://cpee.org/~demo/form/form-f.html</form>
|
33
|
+
<role>Assistant</role>
|
34
|
+
<data>
|
35
|
+
<schaden>10000</schaden>
|
36
|
+
<text>destroyed</text>
|
37
|
+
</data>
|
24
38
|
</arguments>
|
25
39
|
</parameters>
|
26
40
|
<code>
|
27
|
-
<
|
41
|
+
<prepare/>
|
42
|
+
<finalize output="result">data.bla = result</finalize>
|
43
|
+
<update output="result"/>
|
44
|
+
<rescue output="result"/>
|
28
45
|
</code>
|
29
|
-
<annotations
|
30
|
-
|
46
|
+
<annotations>
|
47
|
+
<_timing>
|
48
|
+
<_timing_weight/>
|
49
|
+
<_timing_avg/>
|
50
|
+
<explanations/>
|
51
|
+
</_timing>
|
52
|
+
<_context_data_analysis>
|
53
|
+
<probes/>
|
54
|
+
<ips/>
|
55
|
+
</_context_data_analysis>
|
56
|
+
<report>
|
57
|
+
<url/>
|
58
|
+
</report>
|
59
|
+
<_notes>
|
60
|
+
<_notes_general/>
|
61
|
+
</_notes>
|
62
|
+
</annotations>
|
63
|
+
<documentation>
|
64
|
+
<input/>
|
65
|
+
<output/>
|
66
|
+
<implementation>
|
67
|
+
<description/>
|
68
|
+
</implementation>
|
69
|
+
<code>
|
70
|
+
<description/>
|
71
|
+
</code>
|
72
|
+
</documentation>
|
31
73
|
</call>
|
32
74
|
</description>
|
33
75
|
</description>
|
@@ -36,14 +78,4 @@
|
|
36
78
|
<dataelements type="none"/>
|
37
79
|
<endpoints type="none"/>
|
38
80
|
</transformation>
|
39
|
-
|
40
|
-
<info>Worklist</info>
|
41
|
-
<modeltype>CPEE</modeltype>
|
42
|
-
<organisation1>http://cpee.org/~demo/orgviz/organisation_informatik.xml</organisation1>
|
43
|
-
<theme>extended</theme>
|
44
|
-
<creator>Christine Ashcreek</creator>
|
45
|
-
<author>Christine Ashcreek</author>
|
46
|
-
<design_stage>development</design_stage>
|
47
|
-
<design_dir>Templates.dir</design_dir>
|
48
|
-
</attributes>
|
49
|
-
</testset>
|
81
|
+
</testset>
|
@@ -15,19 +15,22 @@
|
|
15
15
|
<method>:get</method>
|
16
16
|
<arguments/>
|
17
17
|
</parameters>
|
18
|
-
<_timing>
|
19
|
-
<_timing_min/>
|
20
|
-
<_timing_max/>
|
21
|
-
<_timing_avg/>
|
22
|
-
</_timing>
|
23
|
-
<_notes>
|
24
|
-
<_notes_general/>
|
25
|
-
<_attachments/>
|
26
|
-
</_notes>
|
27
18
|
<code>
|
28
19
|
<finalize output="result"/>
|
29
20
|
<update output="result"/>
|
30
21
|
</code>
|
22
|
+
<annotations>
|
23
|
+
<_timing>
|
24
|
+
<_timing_min/>
|
25
|
+
<_timing_max/>
|
26
|
+
<_timing_avg/>
|
27
|
+
</_timing>
|
28
|
+
<_notes>
|
29
|
+
<_notes_general/>
|
30
|
+
<_attachments/>
|
31
|
+
</_notes>
|
32
|
+
</annotations>
|
33
|
+
<documentation/>
|
31
34
|
</call>
|
32
35
|
</description>
|
33
36
|
</description>
|
@@ -43,4 +46,4 @@
|
|
43
46
|
<customer>pilotfabrik</customer>
|
44
47
|
<status>development</status>
|
45
48
|
</attributes>
|
46
|
-
</testset>
|
49
|
+
</testset>
|
@@ -19,14 +19,6 @@
|
|
19
19
|
<endpoints/>
|
20
20
|
<stream/>
|
21
21
|
</arguments>
|
22
|
-
<stream>
|
23
|
-
<sensors/>
|
24
|
-
<aggregators/>
|
25
|
-
<costs/>
|
26
|
-
</stream>
|
27
|
-
<report>
|
28
|
-
<url/>
|
29
|
-
</report>
|
30
22
|
</parameters>
|
31
23
|
<annotations>
|
32
24
|
<_timing>
|
@@ -39,7 +31,11 @@
|
|
39
31
|
<_notes>
|
40
32
|
<_notes_general/>
|
41
33
|
</_notes>
|
34
|
+
<report>
|
35
|
+
<url/>
|
36
|
+
</report>
|
42
37
|
</annotations>
|
38
|
+
<documentation/>
|
43
39
|
</call>
|
44
40
|
</description>
|
45
41
|
</description>
|
@@ -17,19 +17,22 @@
|
|
17
17
|
<timeout>!data.time</timeout>
|
18
18
|
</arguments>
|
19
19
|
</parameters>
|
20
|
-
<_timing>
|
21
|
-
<_timing_min/>
|
22
|
-
<_timing_max/>
|
23
|
-
<_timing_avg/>
|
24
|
-
</_timing>
|
25
|
-
<_notes>
|
26
|
-
<_notes_general/>
|
27
|
-
<_attachments/>
|
28
|
-
</_notes>
|
29
20
|
<code>
|
30
21
|
<finalize output="result">data.duration = data.time</finalize>
|
31
22
|
<update output="result"/>
|
32
23
|
</code>
|
24
|
+
<annotations>
|
25
|
+
<_timing>
|
26
|
+
<_timing_min/>
|
27
|
+
<_timing_max/>
|
28
|
+
<_timing_avg/>
|
29
|
+
</_timing>
|
30
|
+
<_notes>
|
31
|
+
<_notes_general/>
|
32
|
+
<_attachments/>
|
33
|
+
</_notes>
|
34
|
+
</annotations>
|
35
|
+
<documentation/>
|
33
36
|
</call>
|
34
37
|
</description>
|
35
38
|
</description>
|
@@ -311,7 +311,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
311
311
|
},
|
312
312
|
'info': function(node){ return { 'element-endpoint': $(node).attr('endpoint') }; },
|
313
313
|
'resolve_symbol': function(node) {
|
314
|
-
if($('code', node).length > 0) {
|
314
|
+
if($('> code', node).length > 0) {
|
315
315
|
return 'callmanipulate';
|
316
316
|
} else {
|
317
317
|
return 'call';
|
@@ -329,7 +329,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
329
329
|
},
|
330
330
|
'info': function(node){ return { 'element-endpoint': $(node).attr('endpoint') }; },
|
331
331
|
'resolve_symbol': function(node) {
|
332
|
-
if($('code', node).length > 0) {
|
332
|
+
if($('> code', node).length > 0) {
|
333
333
|
return 'callmanipulate';
|
334
334
|
} else {
|
335
335
|
return 'call';
|
@@ -311,7 +311,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
311
311
|
},
|
312
312
|
'info': function(node){ return { 'element-endpoint': $(node).attr('endpoint') }; },
|
313
313
|
'resolve_symbol': function(node) {
|
314
|
-
if($('code', node).length > 0) {
|
314
|
+
if($('> code', node).length > 0) {
|
315
315
|
return 'callmanipulate';
|
316
316
|
} else {
|
317
317
|
return 'call';
|
@@ -329,7 +329,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
329
329
|
},
|
330
330
|
'info': function(node){ return { 'element-endpoint': $(node).attr('endpoint') }; },
|
331
331
|
'resolve_symbol': function(node) {
|
332
|
-
if($('code', node).length > 0) {
|
332
|
+
if($('> code', node).length > 0) {
|
333
333
|
return 'callmanipulate';
|
334
334
|
} else {
|
335
335
|
return 'call';
|
@@ -292,7 +292,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
292
292
|
},
|
293
293
|
'info': function(node){ return { 'element-endpoint': $(node).attr('endpoint') }; },
|
294
294
|
'resolve_symbol': function(node) {
|
295
|
-
if($('code', node).length > 0) {
|
295
|
+
if($('> code', node).length > 0) {
|
296
296
|
return 'callmanipulate';
|
297
297
|
} else {
|
298
298
|
return 'call';
|
@@ -311,7 +311,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
311
311
|
},
|
312
312
|
'info': function(node){ return { 'element-endpoint': $(node).attr('endpoint') }; },
|
313
313
|
'resolve_symbol': function(node) {
|
314
|
-
if($('code', node).length > 0) {
|
314
|
+
if($('> code', node).length > 0) {
|
315
315
|
return 'callmanipulate';
|
316
316
|
} else {
|
317
317
|
return 'call';
|
@@ -311,7 +311,7 @@ function WFAdaptorManifestation(adaptor) {
|
|
311
311
|
},
|
312
312
|
'info': function(node){ return { 'element-endpoint': $(node).attr('endpoint') }; },
|
313
313
|
'resolve_symbol': function(node) {
|
314
|
-
if($('code', node).length > 0) {
|
314
|
+
if($('> code', node).length > 0) {
|
315
315
|
return 'callmanipulate';
|
316
316
|
} else {
|
317
317
|
return 'call';
|
data/cpee.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "cpee"
|
3
|
-
s.version = "2.1.
|
3
|
+
s.version = "2.1.32"
|
4
4
|
s.platform = Gem::Platform::RUBY
|
5
5
|
s.license = "LGPL-3.0"
|
6
6
|
s.summary = "Preliminary release of cloud process execution engine (cpee.org). If you just need workflow execution, without a rest service exposing it, then use WEEL."
|
data/lib/cpee/fail.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
# This file is part of CPEE.
|
3
|
+
#
|
4
|
+
# CPEE is free software: you can redistribute it and/or modify it under the terms
|
5
|
+
# of the GNU General Public License as published by the Free Software Foundation,
|
6
|
+
# either version 3 of the License, or (at your option) any later version.
|
7
|
+
#
|
8
|
+
# CPEE is distributed in the hope that it will be useful, but WITHOUT ANY
|
9
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
10
|
+
# PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
11
|
+
#
|
12
|
+
# You should have received a copy of the GNU General Public License along with
|
13
|
+
# CPEE (file COPYING in the main directory). If not, see
|
14
|
+
# <http://www.gnu.org/licenses/>.
|
15
|
+
|
16
|
+
module CPEE
|
17
|
+
class FAIL < Riddl::Implementation #{{{
|
18
|
+
def response
|
19
|
+
@status = 404
|
20
|
+
nil
|
21
|
+
end
|
22
|
+
end #}}}
|
23
|
+
end
|
data/lib/cpee/implementation.rb
CHANGED
@@ -16,6 +16,7 @@ require 'fileutils'
|
|
16
16
|
require 'redis'
|
17
17
|
require 'riddl/server'
|
18
18
|
require 'riddl/client'
|
19
|
+
require_relative 'fail'
|
19
20
|
require_relative 'redis'
|
20
21
|
require_relative 'message'
|
21
22
|
require_relative 'persistence'
|
@@ -83,7 +84,7 @@ module CPEE
|
|
83
84
|
opts[:sse_connections] = {}
|
84
85
|
|
85
86
|
opts[:statemachine] = CPEE::StateMachine.new opts[:states], %w{running simulating replaying finishing stopping abandoned finished} do |id|
|
86
|
-
opts
|
87
|
+
CPEE::Persistence::extract_item(id,opts,"state")
|
87
88
|
end
|
88
89
|
|
89
90
|
opts[:runtime_cmds] << [
|
@@ -176,16 +177,14 @@ module CPEE
|
|
176
177
|
|
177
178
|
class Instances < Riddl::Implementation #{{{
|
178
179
|
def response
|
179
|
-
|
180
|
+
opts = @a[0]
|
180
181
|
Riddl::Parameter::Complex.new("wis","text/xml") do
|
181
182
|
ins = XML::Smart::string('<instances/>')
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
state = redis.get(statekey)
|
188
|
-
state_changed = redis.get(File.join(statekey,'@changed'))
|
183
|
+
CPEE::Persistence::each_object(opts) do |instance|
|
184
|
+
info = CPEE::Persistence::extract_item(instance,opts,'attributes/info')
|
185
|
+
uuid = CPEE::Persistence::extract_item(instance,opts,'attributes/uuid')
|
186
|
+
state = CPEE::Persistence::extract_item(instance,opts,'state')
|
187
|
+
state_changed = CPEE::Persistence::extract_item(instance,opts,'state/@changed')
|
189
188
|
ins.root.add('instance', info, 'uuid' => uuid, 'id' => instance, 'state' => state, 'state_changed' => state_changed )
|
190
189
|
end
|
191
190
|
ins.to_s
|
@@ -209,9 +208,9 @@ module CPEE
|
|
209
208
|
doc = XML::Smart::open_unprotected(opts[:properties_init])
|
210
209
|
doc.register_namespace 'p', 'http://cpee.org/ns/properties/2.0'
|
211
210
|
name = @p[0].value
|
212
|
-
id =
|
211
|
+
id = CPEE::Persistence::new_object(opts)
|
213
212
|
uuid = SecureRandom.uuid
|
214
|
-
instance = '
|
213
|
+
instance = CPEE::Persistence::OBJ + ':' + id.to_s
|
215
214
|
redis.multi do |multi|
|
216
215
|
multi.zadd('instances',id,id)
|
217
216
|
doc.root.find(PROPERTIES_PATHS_FULL.join(' | ')).each do |e|
|
@@ -235,12 +234,12 @@ module CPEE
|
|
235
234
|
doc.register_namespace 'np', 'http://riddl.org/ns/common-patterns/notifications-producer/2.0'
|
236
235
|
key = File.basename(File.dirname(f))
|
237
236
|
url = doc.find('string(/np:subscription/@url)')
|
238
|
-
multi.sadd("
|
239
|
-
multi.set("
|
237
|
+
multi.sadd(CPEE::Persistence::OBJ + ":#{id}/handlers",key)
|
238
|
+
multi.set(CPEE::Persistence::OBJ + ":#{id}/handlers/#{key}/url",url)
|
240
239
|
doc.find('/np:subscription/np:topic/*').each do |e|
|
241
240
|
c = File.join(e.parent.attributes['id'],e.qname.name,e.text)
|
242
|
-
multi.sadd("
|
243
|
-
multi.sadd("
|
241
|
+
multi.sadd(CPEE::Persistence::OBJ + ":#{id}/handlers/#{key}",c)
|
242
|
+
multi.sadd(CPEE::Persistence::OBJ + ":#{id}/handlers/#{c}",key)
|
244
243
|
end
|
245
244
|
end rescue nil # all the ones that are not ok, are ignored
|
246
245
|
end
|
@@ -251,6 +250,12 @@ module CPEE
|
|
251
250
|
multi.set(File.join(instance, 'state', '@changed'), Time.now.xmlschema(3))
|
252
251
|
end
|
253
252
|
|
253
|
+
content = {
|
254
|
+
:state => 'ready',
|
255
|
+
:attributes => CPEE::Persistence::extract_list(id,opts,'attributes').to_h
|
256
|
+
}
|
257
|
+
CPEE::Message::send(:event,'state/change',File.join(opts[:url],'/'),id,uuid,name,content,redis)
|
258
|
+
|
254
259
|
@headers << Riddl::Header.new("CPEE-INSTANCE", id.to_s)
|
255
260
|
@headers << Riddl::Header.new("CPEE-INSTANCE-URL", File.join(opts[:url].to_s,id.to_s,'/'))
|
256
261
|
@headers << Riddl::Header.new("CPEE-INSTANCE-UUID", uuid)
|
@@ -263,7 +268,7 @@ module CPEE
|
|
263
268
|
def response
|
264
269
|
opts = @a[0]
|
265
270
|
id = @r[0].to_i
|
266
|
-
unless
|
271
|
+
unless CPEE::Persistence::exists?(id,opts)
|
267
272
|
@status = 404
|
268
273
|
return
|
269
274
|
end
|
@@ -285,11 +290,22 @@ module CPEE
|
|
285
290
|
opts = @a[0]
|
286
291
|
redis = opts[:redis]
|
287
292
|
id = @r[0].to_i
|
288
|
-
unless
|
293
|
+
unless CPEE::Persistence::exists?(id,opts)
|
289
294
|
@status = 404
|
290
295
|
return
|
291
296
|
end
|
292
|
-
|
297
|
+
|
298
|
+
content = {
|
299
|
+
:state => 'purged',
|
300
|
+
:attributes => CPEE::Persistence::extract_list(id,opts,'attributes').to_h
|
301
|
+
}
|
302
|
+
state = CPEE::Persistence::extract_item(id,opts,'state')
|
303
|
+
if state == 'stopped' || state == 'ready'
|
304
|
+
CPEE::Message::send(:event,'state/change',File.join(opts[:url],'/'),id,content[:attributes]['uuid'],content[:attributes]['info'],content,redis)
|
305
|
+
end
|
306
|
+
|
307
|
+
empt = CPEE::Persistence::keys(id,opts).to_a
|
308
|
+
empt.delete_if{|e| e =~ /\/handlers/ }
|
293
309
|
redis.multi do |multi|
|
294
310
|
multi.del empt
|
295
311
|
multi.zrem 'instances', id
|
@@ -13,17 +13,22 @@
|
|
13
13
|
# <http://www.gnu.org/licenses/>.
|
14
14
|
|
15
15
|
require 'json'
|
16
|
+
require_relative 'fail'
|
16
17
|
|
17
18
|
module CPEE
|
18
19
|
module Callbacks
|
19
20
|
|
20
21
|
def self::implementation(id,opts)
|
21
22
|
Proc.new do
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
if CPEE::Persistence::exists?(id,opts)
|
24
|
+
run CPEE::Callbacks::Callbacks, id, opts if get
|
25
|
+
on resource do
|
26
|
+
run CPEE::Callbacks::GetCallback, id, opts if get
|
27
|
+
run CPEE::Callbacks::DelCallback, id, opts if delete
|
28
|
+
run CPEE::Callbacks::ExCallback, id, opts if put
|
29
|
+
end
|
30
|
+
else
|
31
|
+
run CPEE::FAIL
|
27
32
|
end
|
28
33
|
end
|
29
34
|
end
|
@@ -50,13 +55,13 @@ module CPEE
|
|
50
55
|
opts = @a[1]
|
51
56
|
callback = @r[-1]
|
52
57
|
|
53
|
-
if
|
58
|
+
if CPEE::Persistence::is_member?(id,opts,'callbacks',callback)
|
54
59
|
res = {}
|
55
|
-
res[:uuid]
|
56
|
-
res[:type]
|
57
|
-
res[:position] = opts
|
58
|
-
res[:label]
|
59
|
-
if sub = opts
|
60
|
+
res[:uuid] = CPEE::Persistence::extract_item(id,opts,"callback/#{callback}/uuid")
|
61
|
+
res[:type] = CPEE::Persistence::extract_item(id,opts,"callback/#{callback}/type")
|
62
|
+
res[:position] = CPEE::Persistence::extract_item(id,opts,"callback/#{callback}/position")
|
63
|
+
res[:label] = CPEE::Persistence::extract_item(id,opts,"callback/#{callback}/label")
|
64
|
+
if sub = CPEE::Persistence::extract_item(id,opts,"callback/#{callback}/subscription")
|
60
65
|
res[:subscription] = sub
|
61
66
|
end
|
62
67
|
|
@@ -73,7 +78,7 @@ module CPEE
|
|
73
78
|
opts = @a[1]
|
74
79
|
callback = @r[-1]
|
75
80
|
|
76
|
-
if opts
|
81
|
+
if CPEE::Persistence::extract_item(id,opts,"callback/#{callback}/type") == 'callback'
|
77
82
|
CPEE::Message::send(
|
78
83
|
:'callback-end',
|
79
84
|
callback,
|
@@ -84,7 +89,7 @@ module CPEE
|
|
84
89
|
{},
|
85
90
|
opts[:redis]
|
86
91
|
)
|
87
|
-
elsif opts
|
92
|
+
elsif CPEE::Persistence::extract_item(id,opts,"callback/#{callback}/type") == 'vote'
|
88
93
|
CPEE::Message::send(
|
89
94
|
:'vote-response',
|
90
95
|
callback,
|
@@ -108,7 +113,7 @@ module CPEE
|
|
108
113
|
opts = @a[1]
|
109
114
|
callback = @r[-1]
|
110
115
|
|
111
|
-
if opts
|
116
|
+
if CPEE::Persistence::extract_item(id,opts,"callback/#{callback}/type") == 'callback'
|
112
117
|
ret = {}
|
113
118
|
ret['values'] = @p.map{ |e|
|
114
119
|
[e.name, e.class == Riddl::Parameter::Simple ? [:simple,e.value] : [:complex,e.mimetype,e.value.path] ]
|
@@ -125,7 +130,7 @@ module CPEE
|
|
125
130
|
ret,
|
126
131
|
opts[:redis]
|
127
132
|
)
|
128
|
-
elsif opts
|
133
|
+
elsif CPEE::Persistence::extract_item(id,opts,"callback/#{callback}/type") == 'vote'
|
129
134
|
if @p.length == 1 && @p[0].name == 'continue' && @p[0].class == Riddl::Parameter::Simple
|
130
135
|
CPEE::Message::send(
|
131
136
|
:'vote-response',
|
@@ -13,29 +13,34 @@
|
|
13
13
|
# <http://www.gnu.org/licenses/>.
|
14
14
|
|
15
15
|
require 'json'
|
16
|
+
require_relative 'fail'
|
16
17
|
|
17
18
|
module CPEE
|
18
19
|
module Notifications
|
19
20
|
|
20
21
|
def self::implementation(id,opts)
|
21
22
|
Proc.new do
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
23
|
+
if CPEE::Persistence::exists?(id,opts)
|
24
|
+
on resource "notifications" do
|
25
|
+
run CPEE::Notifications::Overview if get
|
26
|
+
on resource "topics" do
|
27
|
+
run CPEE::Notifications::Topics, opts if get
|
28
|
+
end
|
29
|
+
on resource "subscriptions" do
|
30
|
+
run CPEE::Notifications::Subscriptions, id, opts if get
|
31
|
+
run CPEE::Notifications::CreateSubscription, id, opts if post 'create_subscription'
|
32
|
+
on resource do
|
33
|
+
run CPEE::Notifications::Subscription, id, opts if get
|
34
|
+
run CPEE::Notifications::UpdateSubscription, id, opts if put 'change_subscription'
|
35
|
+
run CPEE::Notifications::DeleteSubscription, id, opts if delete
|
36
|
+
on resource 'sse' do
|
37
|
+
run CPEE::Notifications::SSE, id, opts if sse
|
38
|
+
end
|
36
39
|
end
|
37
40
|
end
|
38
41
|
end
|
42
|
+
else
|
43
|
+
run CPEE::FAIL
|
39
44
|
end
|
40
45
|
end
|
41
46
|
end
|
@@ -184,7 +189,7 @@ module CPEE
|
|
184
189
|
on.pmessage do |pat, what, message|
|
185
190
|
if pat == 'forward:*'
|
186
191
|
id, key = what.match(/forward:([^\/]+)\/(.+)/).captures
|
187
|
-
if sse = opts.dig(:sse_connections,id
|
192
|
+
if sse = opts.dig(:sse_connections,id,key)
|
188
193
|
sse.send message
|
189
194
|
else
|
190
195
|
DeleteSubscription::set(id,opts,key)
|
@@ -193,7 +198,7 @@ module CPEE
|
|
193
198
|
mess = JSON.parse(message[message.index(' ')+1..-1])
|
194
199
|
state = mess.dig('content','state')
|
195
200
|
if state == 'finished' || state == 'abandoned'
|
196
|
-
opts.dig(:sse_connections,mess.dig('instance').
|
201
|
+
opts.dig(:sse_connections,mess.dig('instance').to_s)&.each do |key,sse|
|
197
202
|
EM.add_timer(10) do # just to be sure that all messages arrived. 10 seconds should be enough ... we think ... therefore we are (not sure)
|
198
203
|
sse.close
|
199
204
|
end
|
@@ -214,7 +219,7 @@ module CPEE
|
|
214
219
|
class SSE < Riddl::SSEImplementation #{{{
|
215
220
|
def onopen
|
216
221
|
@opts = @a[1]
|
217
|
-
@id = @a[0]
|
222
|
+
@id = @a[0].to_s
|
218
223
|
@key = @r[-2]
|
219
224
|
if CPEE::Persistence::exists_handler?(@id,@opts,@key)
|
220
225
|
@opts[:sse_connections][@id] ||= {}
|