cpee 1.3.176 → 1.3.177

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/cockpit/css/ui.css +26 -65
  3. data/cockpit/index.html +60 -77
  4. data/cockpit/js/details.js +8 -3
  5. data/cockpit/js/instance.js +24 -23
  6. data/cockpit/js/ui.js +1 -18
  7. data/cockpit/js/wfadaptor.cpee.js +452 -598
  8. data/cockpit/lib/ui.css +120 -124
  9. data/cockpit/lib/ui.js +84 -34
  10. data/cockpit/lib/wfadaptor.css +5 -5
  11. data/cockpit/lib/wfadaptor.js +5 -11
  12. data/cockpit/testsets/Worklist Parallel.xml +97 -0
  13. data/cockpit/testsets/Worklist Test CPEE.xml +39 -0
  14. data/cpee.gemspec +5 -5
  15. data/lib/cpee/controller.rb +1 -1
  16. data/lib/cpee/processtransformation/cpee.rb +2 -3
  17. data/server/instances/38/properties.xml +46 -0
  18. data/server/instances/39/properties.xml +58 -0
  19. data/server/instances/40/properties.xml +148 -0
  20. data/server/instances/41/properties.xml +46 -0
  21. data/server/instances/42/properties.xml +148 -0
  22. data/server/instances/43/notifications/9e7d05164a8539415d008b5bca3e0672/consumer-secret +1 -0
  23. data/server/instances/43/notifications/9e7d05164a8539415d008b5bca3e0672/producer-secret +1 -0
  24. data/server/instances/{37/notifications/2b67c793efcea22d88beaa28249001be → 43/notifications/9e7d05164a8539415d008b5bca3e0672}/subscription.xml +0 -0
  25. data/server/instances/43/properties.xml +148 -0
  26. data/server/instances/44/properties.xml +148 -0
  27. data/server/instances/45/notifications/442ed76f5da42dc9c57713840d713510/consumer-secret +1 -0
  28. data/server/instances/45/notifications/442ed76f5da42dc9c57713840d713510/producer-secret +1 -0
  29. data/server/instances/45/notifications/442ed76f5da42dc9c57713840d713510/subscription.xml +34 -0
  30. data/server/instances/45/properties.xml +148 -0
  31. data/server/instances/46/properties.xml +46 -0
  32. data/server/instances/47/notifications/63fba892899cc92fca381a666089e8d9/consumer-secret +1 -0
  33. data/server/instances/47/notifications/63fba892899cc92fca381a666089e8d9/producer-secret +1 -0
  34. data/server/instances/47/notifications/63fba892899cc92fca381a666089e8d9/subscription.xml +34 -0
  35. data/server/instances/47/notifications/e0cdacd3147aa31b0478a3ab1155db6c/consumer-secret +1 -0
  36. data/server/instances/47/notifications/e0cdacd3147aa31b0478a3ab1155db6c/producer-secret +1 -0
  37. data/server/instances/47/notifications/e0cdacd3147aa31b0478a3ab1155db6c/subscription.xml +34 -0
  38. data/server/instances/47/properties.xml +148 -0
  39. data/server/resources/transformation_dslx.xsl +4 -4
  40. data/server/server.pid +1 -0
  41. data/test/cb.rb +3 -3
  42. metadata +39 -20
  43. data/cockpit/lib/jquery-ui.custom.min.js +0 -8
  44. data/cockpit/lib/jquery-ui.custom.min.txt +0 -16
  45. data/cockpit/lib/jquery.redraw.js +0 -3
  46. data/server/instances/37/notifications/2b67c793efcea22d88beaa28249001be/consumer-secret +0 -1
  47. data/server/instances/37/notifications/2b67c793efcea22d88beaa28249001be/producer-secret +0 -1
@@ -124,7 +124,7 @@ svg text.normal {
124
124
  font-stretch:normal;
125
125
  text-align:center;
126
126
  line-height:125%;
127
- writing-mode:lr-tb;
127
+ writing-mode:horizontal-tb;
128
128
  text-anchor:middle;
129
129
  color:#000000;
130
130
  fill:#000000;
@@ -140,7 +140,7 @@ svg text.inverted {
140
140
  font-stretch:normal;
141
141
  text-align:center;
142
142
  line-height:125%;
143
- writing-mode:lr-tb;
143
+ writing-mode:horizontal-tb;
144
144
  text-anchor:middle;
145
145
  color:#ffffff;
146
146
  fill:#ffffff;
@@ -157,7 +157,7 @@ svg text.super {
157
157
  font-stretch:normal;
158
158
  text-align:center;
159
159
  line-height:100%;
160
- writing-mode:lr-tb;
160
+ writing-mode:horizontal-tb;
161
161
  text-anchor:start;
162
162
  color:#000000;
163
163
  fill:#000000;
@@ -188,7 +188,7 @@ svg text.normallarge {
188
188
  font-stretch:normal;
189
189
  text-align:center;
190
190
  line-height:125%;
191
- writing-mode:lr-tb;
191
+ writing-mode:horizontal-tb;
192
192
  text-anchor:middle;
193
193
  color:#000000;
194
194
  fill:#000000;
@@ -205,7 +205,7 @@ svg text.small {
205
205
  font-stretch:normal;
206
206
  text-align:center;
207
207
  line-height:125%;
208
- writing-mode:lr-tb;
208
+ writing-mode:horizontal-tb;
209
209
  text-anchor:middle;
210
210
  color:#000000;
211
211
  fill:#000000;
@@ -234,7 +234,7 @@ function WfDescription(wf_adaptor, wf_illustrator) { // Model {{{
234
234
  this.get_node_by_svg_id = function(svg_id) { // {{{
235
235
  return $('[svg-id = \'' + svg_id + '\']', description);
236
236
  } // }}}
237
- this.get_free_id = function() { // {{{
237
+ var get_free_id = this.get_free_id = function() { // {{{
238
238
  var existing = new Array();
239
239
  $('*[id]', description).each(function(){existing.push($(this).attr('id'))});
240
240
  var id = 1;
@@ -242,7 +242,7 @@ function WfDescription(wf_adaptor, wf_illustrator) { // Model {{{
242
242
  id += 1;
243
243
  }
244
244
  return 'a' + id;
245
- } // }}}
245
+ } // }}}
246
246
  var update = this.update = function(svgid) { // {{{
247
247
  id_counter = {};
248
248
  if(update_illustrator){
@@ -263,25 +263,19 @@ function WfDescription(wf_adaptor, wf_illustrator) { // Model {{{
263
263
  // }}}
264
264
  // Adaption functions {{{
265
265
  this.insert_after = function(new_node, target) { // {{{
266
- var nn;
267
- if(typeof(new_node) == 'function') {nn = new_node(target);}
268
- else {nn = new_node;}
266
+ var nn = $X(new_node.replace(/###/,get_free_id()));
269
267
  target.after(nn);
270
268
  nn.attr('new','true');
271
269
  update();
272
270
  } // }}}
273
271
  this.insert_first_into = function(new_node, target, selector) { // {{{
274
- var nn;
275
- if(typeof(new_node) == 'function') {nn = new_node(target);}
276
- else {nn = new_node;}
272
+ var nn = $X(new_node.replace(/###/,get_free_id()));
277
273
  target.prepend(nn);
278
274
  nn.attr('new','true');
279
275
  update();
280
276
  } // }}}
281
277
  this.insert_last_into = function(new_node, target, selector) { // {{{
282
- var nn;
283
- if(typeof(new_node) == 'function') {nn = new_node(target);}
284
- else {nn = new_node;}
278
+ var nn = $X(new_node.replace(/###/,get_free_id()));
285
279
  target.append(nn);
286
280
  nn.attr('new','true');
287
281
  update();
@@ -0,0 +1,97 @@
1
+ <?xml version="1.0"?>
2
+ <testset>
3
+ <dataelements>
4
+ <bla xmlns="http://riddl.org/ns/common-patterns/properties/1.0"/>
5
+ <a xmlns="http://riddl.org/ns/common-patterns/properties/1.0">1</a>
6
+ <b xmlns="http://riddl.org/ns/common-patterns/properties/1.0">1</b>
7
+ <c xmlns="http://riddl.org/ns/common-patterns/properties/1.0">1</c>
8
+ </dataelements>
9
+ <handlerwrapper>DefaultHandlerWrapper</handlerwrapper>
10
+ <endpoints>
11
+ <timeout xmlns="http://riddl.org/ns/common-patterns/properties/1.0">http://gruppe.wst.univie.ac.at/~mangler/services/timeout.php</timeout>
12
+ <cb xmlns="http://riddl.org/ns/common-patterns/properties/1.0">http://solo.wst.univie.ac.at:9302</cb>
13
+ </endpoints>
14
+ <positions/>
15
+ <description>
16
+ <description xmlns="http://cpee.org/ns/description/1.0">
17
+ <parallel svg-label="">
18
+ <parallel_branch svg-label="">
19
+ <call id="a2" endpoint="cb" svg-label="">
20
+ <parameters>
21
+ <label>"OKA"</label>
22
+ <method>:post</method>
23
+ <parameters>
24
+ <orgmodel>"organisation1"</orgmodel>
25
+ <domain>"Virtual Business 1"</domain>
26
+ <form>"http://solo.wst.univie.ac.at/form/form-f.html"</form>
27
+ <role>"regular"</role>
28
+ <schaden>"10001"</schaden>
29
+ <text>"sehr gut"</text>
30
+ </parameters>
31
+ </parameters>
32
+ <finalize>data.a = result.value</finalize>
33
+ </call>
34
+ </parallel_branch>
35
+ <parallel_branch svg-label="">
36
+ <call id="a3" endpoint="cb" svg-label="">
37
+ <parameters>
38
+ <label>"OKB"</label>
39
+ <method>:post</method>
40
+ <parameters>
41
+ <orgmodel>"organisation1"</orgmodel>
42
+ <domain>"Virtual Business 1"</domain>
43
+ <form>"http://solo.wst.univie.ac.at/form/form-f.html"</form>
44
+ <role>"regular"</role>
45
+ <schaden>"12341231"</schaden>
46
+ <text>"totalo kaputto"</text>
47
+ </parameters>
48
+ </parameters>
49
+ <finalize>data.b = result.value</finalize>
50
+ </call>
51
+ </parallel_branch>
52
+ <parallel_branch svg-label="">
53
+ <call id="a4" endpoint="cb">
54
+ <parameters>
55
+ <label>"OKC"</label>
56
+ <method>:post</method>
57
+ <parameters>
58
+ <orgmodel>"organisation1"</orgmodel>
59
+ <domain>"Virtual Business 1"</domain>
60
+ <form>"http://solo.wst.univie.ac.at/form/form-f.html"</form>
61
+ <role>"regular"</role>
62
+ <schaden>"3000"</schaden>
63
+ <text>"ein Totalschaden"</text>
64
+ </parameters>
65
+ </parameters>
66
+ <finalize>data.c = result.value</finalize>
67
+ </call>
68
+ </parallel_branch>
69
+ </parallel>
70
+ <call id="a1" endpoint="cb" svg-label="OK OR NOT OK">
71
+ <parameters>
72
+ <label>"OK OR NOT OK"</label>
73
+ <method>:post</method>
74
+ <parameters>
75
+ <orgmodel>"organisation1"</orgmodel>
76
+ <domain>"Virtual Business 1"</domain>
77
+ <form>"http://solo.wst.univie.ac.at/form/form-f.html"</form>
78
+ <role>"regular"</role>
79
+ <schaden>"55546"</schaden>
80
+ <text>"fetzen hin"</text>
81
+ </parameters>
82
+ </parameters>
83
+ <finalize>data.bla = result.value</finalize>
84
+ </call>
85
+ </description>
86
+ </description>
87
+ <transformation>
88
+ <description type="copy"/>
89
+ <dataelements type="none"/>
90
+ <endpoints type="none"/>
91
+ </transformation>
92
+ <attributes>
93
+ <info xmlns="http://riddl.org/ns/common-patterns/properties/1.0">asda</info>
94
+ <modeltype xmlns="http://riddl.org/ns/common-patterns/properties/1.0">CPEE</modeltype>
95
+ <organisation1 xmlns="http://riddl.org/ns/common-patterns/properties/1.0">http://cpee.org/~demo/orgviz/organisation_informatik.xml</organisation1>
96
+ </attributes>
97
+ </testset>
@@ -0,0 +1,39 @@
1
+ <?xml version="1.0"?>
2
+ <testset>
3
+ <dataelements><bla xmlns="http://riddl.org/ns/common-patterns/properties/1.0"/></dataelements>
4
+ <handlerwrapper>DefaultHandlerWrapper</handlerwrapper>
5
+ <endpoints>
6
+ <timeout xmlns="http://riddl.org/ns/common-patterns/properties/1.0">http://gruppe.wst.univie.ac.at/~mangler/services/timeout.php</timeout>
7
+ <cb xmlns="http://riddl.org/ns/common-patterns/properties/1.0">http://cpee.org:9302</cb>
8
+ </endpoints>
9
+ <positions/>
10
+ <description>
11
+ <description xmlns="http://cpee.org/ns/description/1.0">
12
+ <call id="a1" endpoint="cb">
13
+ <parameters>
14
+ <label>"OK OR NOT OK"</label>
15
+ <method>:post</method>
16
+ <parameters>
17
+ <orgmodel>"organisation1"</orgmodel>
18
+ <domain>"Virtual Business 1"</domain>
19
+ <form>"http://cpee.org/forms/form-f.html"</form>
20
+ <role>"regular"</role>
21
+ <schaden>"55546"</schaden>
22
+ <text>"fetzen hin"</text>
23
+ </parameters>
24
+ </parameters>
25
+ <manipulate>data.bla = result.value</manipulate>
26
+ </call>
27
+ </description>
28
+ </description>
29
+ <transformation>
30
+ <description type="copy"/>
31
+ <dataelements type="none"/>
32
+ <endpoints type="none"/>
33
+ </transformation>
34
+ <attributes>
35
+ <info xmlns="http://riddl.org/ns/common-patterns/properties/1.0">asda</info>
36
+ <modeltype xmlns="http://riddl.org/ns/common-patterns/properties/1.0">CPEE</modeltype>
37
+ <organisation1 xmlns="http://riddl.org/ns/common-patterns/properties/1.0">http://cpee.org/~demo/orgviz/organisation_informatik.xml</organisation1>
38
+ </attributes>
39
+ </testset>
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "cpee"
3
- s.version = "1.3.176"
3
+ s.version = "1.3.177"
4
4
  s.platform = Gem::Platform::RUBY
5
5
  s.license = "LGPL-3"
6
6
  s.summary = "Preliminary release of cloud process execution engine (cpee). If you just need workflow execution, without a rest/xmpp service exposing it, then use WEEL"
@@ -18,8 +18,8 @@ Gem::Specification.new do |s|
18
18
  s.email = 'juergen.mangler@gmail.com'
19
19
  s.homepage = 'http://cpee.org/'
20
20
 
21
- s.add_runtime_dependency 'riddl'
22
- s.add_runtime_dependency 'weel'
23
- s.add_runtime_dependency 'savon'
24
- s.add_runtime_dependency 'highline'
21
+ s.add_runtime_dependency 'riddl', '>= 0.99.180'
22
+ s.add_runtime_dependency 'weel', '>= 1.99.39'
23
+ s.add_runtime_dependency 'savon', '~> 2'
24
+ s.add_runtime_dependency 'highline', '~> 1.6'
25
25
  end
@@ -251,7 +251,7 @@ module CPEE
251
251
  end
252
252
  end
253
253
  end
254
- evs.each { |e| @votes[e].delete(key) if @votes[e] }
254
+ evs.each { |e| @events[e].delete(key) if @events[e] }
255
255
  vos.each do |e|
256
256
  @callbacks.each{|voteid,cb|cb.delete_if!(e,key)}
257
257
  @votes[e].delete(key) if @votes[e]
@@ -54,8 +54,7 @@ module CPEE
54
54
 
55
55
  def print_Node(node,res)
56
56
  if node.endpoints.empty? && !node.script.nil? && node.script.strip != ''
57
- n = res.add('d:manipulate', 'id' => "a#{node.niceid}")
58
- n.text = node.script
57
+ n = res.add('d:manipulate', 'id' => "a#{node.niceid}", node.script)
59
58
  n.attributes['output'] = node.script_var unless node.script_var.nil?
60
59
  n.attributes['language'] = node.script_type unless node.script_type.nil?
61
60
  else
@@ -70,7 +69,7 @@ module CPEE
70
69
  par.add(k,v)
71
70
  end
72
71
  if !node.script.nil? && node.script.strip != ''
73
- x = n.add('manipulate',node.script)
72
+ x = n.add('d:finalize',node.script)
74
73
  x.attributes['output'] = node.script_var unless node.script_var.nil?
75
74
  x.attributes['language'] = node.script_type unless node.script_type.nil?
76
75
  end
@@ -0,0 +1,46 @@
1
+ <properties xmlns="http://riddl.org/ns/common-patterns/properties/1.0">
2
+ <attributes>
3
+ <info>Enter info here</info>
4
+ <modeltype>CPEE</modeltype>
5
+ </attributes>
6
+ <state>ready</state>
7
+ <handlerwrapper>DefaultHandlerWrapper</handlerwrapper>
8
+ <positions/>
9
+ <dataelements/>
10
+ <endpoints>
11
+ <timeout>http://gruppe.wst.univie.ac.at/~mangler/services/timeout.php</timeout>
12
+ </endpoints>
13
+ <dsl>call :a1, :cb, { :label =&gt; "", :method =&gt; :post, :parameters =&gt; nil }
14
+ </dsl>
15
+ <dslx>
16
+ <description xmlns="http://cpee.org/ns/description/1.0">
17
+ <call id="a1" endpoint="cb">
18
+ <parameters>
19
+ <label>""</label>
20
+ <method>:post</method>
21
+ <parameters/>
22
+ </parameters>
23
+ </call>
24
+ </description>
25
+ </dslx>
26
+ <status>
27
+ <id>0</id>
28
+ <message>undefined</message>
29
+ </status>
30
+ <description>
31
+ <description xmlns="http://cpee.org/ns/description/1.0">
32
+ <call id="a1" endpoint="cb">
33
+ <parameters>
34
+ <label>""</label>
35
+ <method>:post</method>
36
+ <parameters/>
37
+ </parameters>
38
+ </call>
39
+ </description>
40
+ </description>
41
+ <transformation>
42
+ <description type="copy"/>
43
+ <dataelements type="none"/>
44
+ <endpoints type="none"/>
45
+ </transformation>
46
+ </properties>
@@ -0,0 +1,58 @@
1
+ <properties xmlns="http://riddl.org/ns/common-patterns/properties/1.0">
2
+ <attributes>
3
+ <info>Enter info here</info>
4
+ <modeltype>CPEE</modeltype>
5
+ </attributes>
6
+ <state>stopped</state>
7
+ <handlerwrapper>DefaultHandlerWrapper</handlerwrapper>
8
+ <positions>
9
+ <a1>at</a1>
10
+ </positions>
11
+ <dataelements>
12
+ <b>8</b>
13
+ </dataelements>
14
+ <endpoints>
15
+ <cb>http://gruppe.wst.univie.ac.at/~mangler/services/callback.simple.php</cb>
16
+ </endpoints>
17
+ <dsl>call :a1, :cb, { :label =&gt; "Update", :method =&gt; :post, :parameters =&gt; nil }, &lt;&lt;-END, &lt;&lt;-END
18
+ data.a = result.value
19
+ END
20
+ data.b = result.value
21
+ END
22
+ </dsl>
23
+ <dslx>
24
+ <description xmlns="http://cpee.org/ns/description/1.0">
25
+ <call id="a1" endpoint="cb">
26
+ <parameters>
27
+ <label>"Update"</label>
28
+ <method>:post</method>
29
+ <parameters/>
30
+ </parameters>
31
+ <finalize>data.a = result.value</finalize>
32
+ <update>data.b = result.value</update>
33
+ </call>
34
+ </description>
35
+ </dslx>
36
+ <status>
37
+ <id>0</id>
38
+ <message>undefined</message>
39
+ </status>
40
+ <description>
41
+ <description xmlns="http://cpee.org/ns/description/1.0">
42
+ <call id="a1" endpoint="cb">
43
+ <parameters>
44
+ <label>"Update"</label>
45
+ <method>:post</method>
46
+ <parameters/>
47
+ </parameters>
48
+ <finalize>data.a = result.value</finalize>
49
+ <update>data.b = result.value</update>
50
+ </call>
51
+ </description>
52
+ </description>
53
+ <transformation>
54
+ <description type="copy"/>
55
+ <dataelements type="none"/>
56
+ <endpoints type="none"/>
57
+ </transformation>
58
+ </properties>
@@ -0,0 +1,148 @@
1
+ <properties xmlns="http://riddl.org/ns/common-patterns/properties/1.0">
2
+ <attributes>
3
+ <info>Enter info here</info>
4
+ <modeltype>CPEE</modeltype>
5
+ </attributes>
6
+ <state>ready</state>
7
+ <handlerwrapper>DefaultHandlerWrapper</handlerwrapper>
8
+ <positions/>
9
+ <dataelements>
10
+ <persons>3</persons>
11
+ <card>Visa_12345</card>
12
+ <airline>null</airline>
13
+ <hotels>[]</hotels>
14
+ <from>Vienna</from>
15
+ <to>Prague</to>
16
+ <costs>0</costs>
17
+ </dataelements>
18
+ <endpoints>
19
+ <bookAir>http://gruppe.wst.univie.ac.at/~mangler/services/airline.php</bookAir>
20
+ <bookHotel>http://gruppe.wst.univie.ac.at/~mangler/services/hotel.php</bookHotel>
21
+ <approve>http://gruppe.wst.univie.ac.at/~mangler/services/approval.php</approve>
22
+ </endpoints>
23
+ <dsl>call :a1, :bookAir, { :method =&gt; :post, :parameters =&gt; {:from =&gt; data.from, :to =&gt; data.to, :persons =&gt; data.persons} }, &lt;&lt;-END
24
+ data.airline = result.value('id')
25
+ data.costs += result.value('costs').to_f
26
+ status.update 1, 'Hotel'
27
+ END
28
+ parallel do
29
+ loop pre_test{data.persons &gt; 0} do
30
+ parallel_branch data.persons do |p|
31
+ call :a2, :bookHotel, { :method =&gt; :post, :parameters =&gt; {:to =&gt; data.to} }, &lt;&lt;-END
32
+ data.hotels &lt;&lt; result.value('id')
33
+ data.costs += result.value('costs').to_f
34
+ END
35
+ end
36
+ manipulate :a3, &lt;&lt;-END
37
+ data.persons -= 1
38
+ END
39
+ end
40
+ end
41
+ choose :inclusive do
42
+ alternative "data.costs &gt; 700" do
43
+ call :a4, :approve, { :method =&gt; :post, :parameters =&gt; {:costs =&gt; data.costs} }
44
+ end
45
+ end
46
+ </dsl>
47
+ <dslx>
48
+ <description xmlns="http://cpee.org/ns/description/1.0">
49
+ <call id="a1" endpoint="bookAir">
50
+ <parameters>
51
+ <method>:post</method>
52
+ <parameters>
53
+ <from>data.from</from>
54
+ <to>data.to</to>
55
+ <persons>data.persons</persons>
56
+ </parameters>
57
+ </parameters>
58
+ <finalize output="result"> data.airline = result.value('id')
59
+ data.costs += result.value('costs').to_f
60
+ status.update 1, 'Hotel'</finalize>
61
+ </call>
62
+ <parallel>
63
+ <loop pre_test="data.persons &gt; 0">
64
+ <parallel_branch pass="data.persons" local="p">
65
+ <call id="a2" endpoint="bookHotel">
66
+ <parameters>
67
+ <method>:post</method>
68
+ <parameters>
69
+ <to>data.to</to>
70
+ </parameters>
71
+ </parameters>
72
+ <finalize output="result"> data.hotels &lt;&lt; result.value('id')
73
+ data.costs += result.value('costs').to_f</finalize>
74
+ </call>
75
+ </parallel_branch>
76
+ <manipulate id="a3"> data.persons -= 1</manipulate>
77
+ </loop>
78
+ </parallel>
79
+ <choose>
80
+ <alternative condition="data.costs &gt; 700">
81
+ <call id="a4" endpoint="approve">
82
+ <parameters>
83
+ <method>:post</method>
84
+ <parameters>
85
+ <costs>data.costs</costs>
86
+ </parameters>
87
+ </parameters>
88
+ </call>
89
+ </alternative>
90
+ </choose>
91
+ </description>
92
+ </dslx>
93
+ <status>
94
+ <id>0</id>
95
+ <message>undefined</message>
96
+ </status>
97
+ <description>
98
+ <description xmlns="http://cpee.org/ns/description/1.0">
99
+ <call id="a1" endpoint="bookAir">
100
+ <parameters>
101
+ <method>:post</method>
102
+ <parameters>
103
+ <from>data.from</from>
104
+ <to>data.to</to>
105
+ <persons>data.persons</persons>
106
+ </parameters>
107
+ </parameters>
108
+ <finalize output="result"> data.airline = result.value('id')
109
+ data.costs += result.value('costs').to_f
110
+ status.update 1, 'Hotel'</finalize>
111
+ </call>
112
+ <parallel>
113
+ <loop pre_test="data.persons &gt; 0">
114
+ <parallel_branch pass="data.persons" local="p">
115
+ <call id="a2" endpoint="bookHotel">
116
+ <parameters>
117
+ <method>:post</method>
118
+ <parameters>
119
+ <to>data.to</to>
120
+ </parameters>
121
+ </parameters>
122
+ <finalize output="result"> data.hotels &lt;&lt; result.value('id')
123
+ data.costs += result.value('costs').to_f</finalize>
124
+ </call>
125
+ </parallel_branch>
126
+ <manipulate id="a3"> data.persons -= 1</manipulate>
127
+ </loop>
128
+ </parallel>
129
+ <choose>
130
+ <alternative condition="data.costs &gt; 700">
131
+ <call id="a4" endpoint="approve">
132
+ <parameters>
133
+ <method>:post</method>
134
+ <parameters>
135
+ <costs>data.costs</costs>
136
+ </parameters>
137
+ </parameters>
138
+ </call>
139
+ </alternative>
140
+ </choose>
141
+ </description>
142
+ </description>
143
+ <transformation>
144
+ <description type="copy"/>
145
+ <dataelements type="rest"/>
146
+ <endpoints type="rest"/>
147
+ </transformation>
148
+ </properties>