cpee 1.3.228 → 1.3.230

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.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/cockpit/css/wfadaptor.css +11 -0
  3. data/cockpit/graph.html +2 -1
  4. data/cockpit/index.html +1 -1
  5. data/cockpit/js/instance.js +50 -56
  6. data/cockpit/js/ui.js +2 -0
  7. data/cockpit/js/wfadaptor.js +21 -9
  8. data/cockpit/themes/compact/theme.js +12 -71
  9. data/cockpit/themes/default/rngs/choose.rng +4 -0
  10. data/cockpit/themes/default/rngs/parallel.rng +8 -0
  11. data/cockpit/themes/default/rngs/stop.rng +5 -0
  12. data/cockpit/themes/default/rngs/terminate.rng +1 -0
  13. data/cockpit/themes/default/symbols/stop.svg +5 -0
  14. data/cockpit/themes/default/symbols/terminate.svg +4 -0
  15. data/cockpit/themes/default/theme.js +104 -3
  16. data/cpee.gemspec +1 -1
  17. data/lib/cpee/instantiation.rb +116 -56
  18. data/lib/instantiation.xml +55 -15
  19. data/log/log.xml +1 -15
  20. data/log/template.xes_xml +23 -0
  21. data/log/template.xes_yaml +26 -0
  22. data/log/{server.rb → xes_xml.rb} +11 -42
  23. data/log/xes_yaml.rb +111 -0
  24. data/server/handlerwrappers/default.rb +19 -10
  25. data/server/resources/properties.schema.active +18 -17
  26. data/server/resources/properties.schema.finished +18 -17
  27. data/server/resources/properties.schema.inactive +18 -17
  28. data/server/resources/transformation_dslx.xsl +29 -5
  29. data/server/server.rb +1 -1
  30. data/tools/instantiation/instantiation +1 -1
  31. data/tools/server/server.rb +1 -1
  32. metadata +10 -19
  33. data/cockpit/themes/default/rngs/callmanipulateworkqueue.rng +0 -122
  34. data/cockpit/themes/default/rngs/callworkqueue.rng +0 -107
  35. data/cockpit/themes/default/symbols/callcorrelationreceive.svg +0 -6
  36. data/cockpit/themes/default/symbols/callcorrelationsend.svg +0 -6
  37. data/cockpit/themes/default/symbols/callinstantiation.svg +0 -3
  38. data/cockpit/themes/default/symbols/callmanipulateworklist.svg +0 -6
  39. data/cockpit/themes/default/symbols/callmanipulateworkqueue.svg +0 -6
  40. data/cockpit/themes/default/symbols/callworklist.svg +0 -4
  41. data/cockpit/themes/default/symbols/callworkqueue.svg +0 -4
  42. data/log/logoverlay.xml +0 -10
  43. data/log/template.xes +0 -6
  44. data/log/yaml/log.xml +0 -27
  45. data/log/yaml/logoverlay.xml +0 -10
  46. data/log/yaml/server.rb +0 -128
  47. data/log/yaml/topics.xml +0 -22
  48. data/log/yaml/yaml.rb +0 -19
@@ -5,4 +5,8 @@
5
5
  <value>inclusive</value>
6
6
  </choice>
7
7
  </attribute>
8
+ <element name="alternative">
9
+ <attribute name="condition"><data type="string"/></attribute>
10
+ </element>
11
+ <element name="otherwise"/>
8
12
  </element>
@@ -2,4 +2,12 @@
2
2
  <attribute name="wait" rngui:label="Wait" rngui:default="-1" rngui:hint="-1 to wait for all branches.">
3
3
  <data type="integer"/>
4
4
  </attribute>
5
+ <element name="parallel_branch">
6
+ <attribute name="pass"><data type="string"/></attribute>
7
+ <attribute name="local"><data type="string"/></attribute>
8
+ </element>
9
+ <element name="parallel_branch">
10
+ <attribute name="pass"><data type="string"/></attribute>
11
+ <attribute name="local"><data type="string"/></attribute>
12
+ </element>
5
13
  </element>
@@ -0,0 +1,5 @@
1
+ <element rngui:version="1.2" name="stop" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes" xmlns="http://relaxng.org/ns/structure/1.0" xmlns:rngui="http://rngui.org">
2
+ <attribute name="id" rngui:label="ID" rngui:default="javascript:get_free_id()">
3
+ <data type="string" rngui:readonly="true"/>
4
+ </attribute>
5
+ </element>
@@ -0,0 +1 @@
1
+ <element rngui:version="1.2" name="terminate" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes" xmlns="http://relaxng.org/ns/structure/1.0" xmlns:rngui="http://rngui.org"/>
@@ -0,0 +1,5 @@
1
+ <svg class="clickable" xmlns="http://www.w3.org/2000/svg">
2
+ <circle cx="15" cy="15" r="14" class="hfill rfill cline stand"/>
3
+ <line x1="12.5" y1="22.5" x2="12.5" y2="8.5" class="stand"/>
4
+ <line x1="17.5" y1="22.5" x2="17.5" y2="8.5" class="stand"/>
5
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg class="clickable" xmlns="http://www.w3.org/2000/svg">
2
+ <circle cx="15" cy="15" r="14" class="stand"/>
3
+ <circle cx="15" cy="15" r="9" class="black"/>
4
+ </svg>
@@ -59,10 +59,10 @@ function WFAdaptorManifestation(adaptor) {
59
59
  var tab = $('#dat_details');
60
60
  var node = self.adaptor.description.get_node_by_svg_id(svgid).get(0);
61
61
  tab.empty();
62
- if (self.adaptor.description.elements[$(node).attr('svg-type')]) {
62
+ if (self.adaptor.description.elements[$(node).attr('svg-subtype')]) {
63
63
  save['details_target'] = { 'svgid': svgid, 'model': self.adaptor.description };
64
- var rng = self.adaptor.description.elements[$(node).attr('svg-type')].clone();
65
- if (save['endpoints_cache'][$(node).attr('endpoint')]) {
64
+ var rng = self.adaptor.description.elements[$(node).attr('svg-subtype')].clone();
65
+ if (save['endpoints_cache'][$(node).attr('endpoint')] && save['endpoints_cache'][$(node).attr('endpoint')].schema) {
66
66
  var schema = save['endpoints_cache'][$(node).attr('endpoint')].schema.documentElement;
67
67
  $(rng).find(' > element[name="parameters"] > element[name="arguments"]').replaceWith($(schema).clone());
68
68
  }
@@ -275,6 +275,37 @@ function WFAdaptorManifestation(adaptor) {
275
275
  'click': self.events.click,
276
276
  }//}}}
277
277
  }; /*}}}*/
278
+ this.elements.stop = { /*{{{*/
279
+ 'type': 'primitive',
280
+ 'illustrator': {//{{{
281
+ 'endnodes': 'this',
282
+ 'svg': self.adaptor.theme_dir + 'symbols/stop.svg'
283
+ },//}}}
284
+ 'description': self.adaptor.theme_dir + 'rngs/stop.rng',
285
+ 'permissible_children': function(node,mode) { //{{{
286
+ return [];
287
+ }, //}}}
288
+ 'adaptor': {//{{{
289
+ 'mousedown': function (node,e) { self.events.mousedown(node,e,false,true); },
290
+ 'click': self.events.click,
291
+ }//}}}
292
+ }; /*}}}*/
293
+ this.elements.terminate = { /*{{{*/
294
+ 'type': 'primitive',
295
+ 'illustrator': {//{{{
296
+ 'endnodes': 'this',
297
+ 'final': true,
298
+ 'svg': self.adaptor.theme_dir + 'symbols/terminate.svg'
299
+ },//}}}
300
+ 'description': self.adaptor.theme_dir + 'rngs/terminate.rng',
301
+ 'permissible_children': function(node,mode) { //{{{
302
+ return [];
303
+ }, //}}}
304
+ 'adaptor': {//{{{
305
+ 'mousedown': function (node,e) { self.events.mousedown(node,e,false,true); },
306
+ 'click': self.events.click,
307
+ }//}}}
308
+ }; /*}}}*/
278
309
 
279
310
  // Complex Elements
280
311
  this.elements.choose = { /*{{{*/
@@ -390,6 +421,16 @@ function WFAdaptorManifestation(adaptor) {
390
421
  'menu_icon': self.elements.loop.illustrator.svg.clone(),
391
422
  'type': 'loop',
392
423
  'params': [self.adaptor.description.elements.loop, node]},
424
+ {'label': 'Terminate',
425
+ 'function_call': func,
426
+ 'menu_icon': self.elements.terminate.illustrator.svg.clone(),
427
+ 'type': 'terminate',
428
+ 'params': [self.adaptor.description.elements.terminate, node]},
429
+ {'label': 'Stop',
430
+ 'function_call': func,
431
+ 'menu_icon': self.elements.stop.illustrator.svg.clone(),
432
+ 'type': 'stop',
433
+ 'params': [self.adaptor.description.elements.stop, node]},
393
434
  {'label': 'Critical',
394
435
  'function_call': func,
395
436
  'menu_icon': self.elements.critical.illustrator.svg.clone(),
@@ -463,6 +504,16 @@ function WFAdaptorManifestation(adaptor) {
463
504
  'menu_icon': self.elements.loop.illustrator.svg.clone(),
464
505
  'type': 'loop',
465
506
  'params': [self.adaptor.description.elements.loop, node]},
507
+ {'label': 'Terminate',
508
+ 'function_call': func,
509
+ 'menu_icon': self.elements.terminate.illustrator.svg.clone(),
510
+ 'type': 'terminate',
511
+ 'params': [self.adaptor.description.elements.terminate, node]},
512
+ {'label': 'Stop',
513
+ 'function_call': func,
514
+ 'menu_icon': self.elements.stop.illustrator.svg.clone(),
515
+ 'type': 'stop',
516
+ 'params': [self.adaptor.description.elements.stop, node]},
466
517
  {'label': 'Critical',
467
518
  'function_call': func,
468
519
  'menu_icon': self.elements.critical.illustrator.svg.clone(),
@@ -525,6 +576,16 @@ function WFAdaptorManifestation(adaptor) {
525
576
  'menu_icon': self.elements.loop.illustrator.svg.clone(),
526
577
  'type': 'loop',
527
578
  'params': [self.adaptor.description.elements.loop, node]},
579
+ {'label': 'Terminate',
580
+ 'function_call': func,
581
+ 'menu_icon': self.elements.terminate.illustrator.svg.clone(),
582
+ 'type': 'terminate',
583
+ 'params': [self.adaptor.description.elements.terminate, node]},
584
+ {'label': 'Stop',
585
+ 'function_call': func,
586
+ 'menu_icon': self.elements.stop.illustrator.svg.clone(),
587
+ 'type': 'stop',
588
+ 'params': [self.adaptor.description.elements.stop, node]},
528
589
  {'label': 'Critical',
529
590
  'function_call': func,
530
591
  'menu_icon': self.elements.critical.illustrator.svg.clone(),
@@ -602,6 +663,16 @@ function WFAdaptorManifestation(adaptor) {
602
663
  'menu_icon': self.elements.loop.illustrator.svg.clone(),
603
664
  'type': 'loop',
604
665
  'params': [self.adaptor.description.elements.loop, node]},
666
+ {'label': 'Terminate',
667
+ 'function_call': self.adaptor.description.insert_last_into,
668
+ 'menu_icon': self.elements.terminate.illustrator.svg.clone(),
669
+ 'type': 'terminate',
670
+ 'params': [self.adaptor.description.elements.terminate, node]},
671
+ {'label': 'Stop',
672
+ 'function_call': self.adaptor.description.insert_last_into,
673
+ 'menu_icon': self.elements.stop.illustrator.svg.clone(),
674
+ 'type': 'stop',
675
+ 'params': [self.adaptor.description.elements.stop, node]},
605
676
  {'label': 'Critical',
606
677
  'function_call': self.adaptor.description.insert_last_into,
607
678
  'menu_icon': self.elements.critical.illustrator.svg.clone(),
@@ -683,6 +754,16 @@ function WFAdaptorManifestation(adaptor) {
683
754
  'menu_icon': self.elements.loop.illustrator.svg.clone(),
684
755
  'type': 'loop',
685
756
  'params': [self.adaptor.description.elements.loop, node]},
757
+ {'label': 'Terminate',
758
+ 'function_call': func,
759
+ 'menu_icon': self.elements.terminate.illustrator.svg.clone(),
760
+ 'type': 'terminate',
761
+ 'params': [self.adaptor.description.elements.terminate, node]},
762
+ {'label': 'Stop',
763
+ 'function_call': func,
764
+ 'menu_icon': self.elements.stop.illustrator.svg.clone(),
765
+ 'type': 'stop',
766
+ 'params': [self.adaptor.description.elements.stop, node]},
686
767
  {'label': 'Critical',
687
768
  'function_call': func,
688
769
  'menu_icon': self.elements.critical.illustrator.svg.clone(),
@@ -758,6 +839,16 @@ function WFAdaptorManifestation(adaptor) {
758
839
  'menu_icon': self.elements.loop.illustrator.svg.clone(),
759
840
  'type': 'loop',
760
841
  'params': [self.adaptor.description.elements.loop, node]},
842
+ {'label': 'Terminate',
843
+ 'function_call': func,
844
+ 'menu_icon': self.elements.terminate.illustrator.svg.clone(),
845
+ 'type': 'terminate',
846
+ 'params': [self.adaptor.description.elements.terminate, node]},
847
+ {'label': 'Stop',
848
+ 'function_call': func,
849
+ 'menu_icon': self.elements.stop.illustrator.svg.clone(),
850
+ 'type': 'stop',
851
+ 'params': [self.adaptor.description.elements.stop, node]},
761
852
  {'label': 'Critical',
762
853
  'function_call': func,
763
854
  'menu_icon': self.elements.critical.illustrator.svg.clone(),
@@ -856,6 +947,16 @@ function WFAdaptorManifestation(adaptor) {
856
947
  'menu_icon': self.elements.loop.illustrator.svg.clone(),
857
948
  'type': 'loop',
858
949
  'params': [self.adaptor.description.elements.loop, node]},
950
+ {'label': 'Terminate',
951
+ 'function_call': func,
952
+ 'menu_icon': self.elements.terminate.illustrator.svg.clone(),
953
+ 'type': 'terminate',
954
+ 'params': [self.adaptor.description.elements.terminate, node]},
955
+ {'label': 'Stop',
956
+ 'function_call': func,
957
+ 'menu_icon': self.elements.stop.illustrator.svg.clone(),
958
+ 'type': 'stop',
959
+ 'params': [self.adaptor.description.elements.stop, node]},
859
960
  {'label': 'Critical',
860
961
  'function_call': func,
861
962
  'menu_icon': self.elements.critical.illustrator.svg.clone(),
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "cpee"
3
- s.version = "1.3.228"
3
+ s.version = "1.3.230"
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). If you just need workflow execution, without a rest/xmpp service exposing it, then use WEEL"
@@ -23,9 +23,8 @@ module CPEE
23
23
 
24
24
  SERVER = File.expand_path(__dir__ + '/../instantiation.xml')
25
25
 
26
- module Testset #{{{
27
-
28
- def self::load(tdoc,cpee)
26
+ module Helpers #{{{
27
+ def load_testset(tdoc,cpee) #{{{
29
28
  ins = -1
30
29
  XML::Smart.string(tdoc) do |doc|
31
30
  doc.register_namespace 'desc', 'http://cpee.org/ns/description/1.0'
@@ -70,75 +69,136 @@ module CPEE
70
69
  end
71
70
  end
72
71
  return ins
73
- end
72
+ end #}}}
73
+ private :load_testset
74
+ def handle_waiting(cpee,instance,behavior) #{{{
75
+ if behavior =~ /^wait/
76
+ condition = behavior.match(/_([^_]+)_/)&.[](1) || 'finished'
77
+ @headers << Riddl::Header.new('CPEE_CALLBACK','true')
78
+ cb = @h['CPEE_CALLBACK']
74
79
 
80
+ if cb
81
+ srv = Riddl::Client.new(cpee, cpee + "?riddl-description")
82
+ status, response = srv.resource("/#{instance}/notifications/subscriptions/").post [
83
+ Riddl::Parameter::Simple.new("topic","state"),
84
+ Riddl::Parameter::Simple.new("events","change"),
85
+ ]
86
+ key = response.first.value
87
+
88
+ srv.resource("/#{instance}/notifications/subscriptions/#{key}/ws/").ws do |conn|
89
+ conn.on :message do |msg|
90
+ if JSON::parse(XML::Smart::string(msg.data).find('string(/event/notification)'))['state'] == condition
91
+ conn.close
92
+ Riddl::Client.new(cb).put [
93
+ # TODO extract all dataelements from instance
94
+ Riddl::Parameter::Simple.new('instance',instance)
95
+ ]
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end #}}}
102
+ private :handle_waiting
103
+ def handle_starting(cpee,instance,behavior) #{{{
104
+ if behavior =~ /_running$/
105
+ srv = Riddl::Client.new(cpee, cpee + "?riddl-description")
106
+ res = srv.resource("/#{instance}/properties/values")
107
+ status, response = res.put [
108
+ Riddl::Parameter::Simple.new('name', 'state'),
109
+ Riddl::Parameter::Simple.new('value','running')
110
+ ]
111
+ end
112
+ end #}}}
113
+ private :handle_starting
114
+ def handle_data(cpee,instance,data)
115
+ if data
116
+ srv = Riddl::Client.new(cpee, cpee + "?riddl-description")
117
+ JSON::parse(data).each do |k,v|
118
+ res = srv.resource("/#{instance}/properties/values/dataelements/#{k}")
119
+ status, response = res.put [
120
+ Riddl::Parameter::Simple.new('value',v)
121
+ ]
122
+ end rescue nil
123
+ end
124
+ end
75
125
  end #}}}
76
126
 
77
- class Instantiate < Riddl::Implementation
127
+ class InstantiateUrl < Riddl::Implementation #{{{
128
+ include Helpers
129
+
78
130
  def response
79
131
  cpee = @a[0]
80
- tdoc = case @p[@p.length - 1].name
81
- when 'url'
82
- status, res = Riddl::Client.new(@p[@p.length - 1].value).get
83
- if status >= 200 && status < 300
84
- res[0].value.read
85
- else
86
- (@status = 500) && return
87
- end
88
- when 'xml'
89
- if @p[@p.length - 1].additional =~ /base64/
90
- Base64.decode64(@p[@p.length - 1].value.read)
91
- else
92
- @p[@p.length - 1].value.read
93
- end
132
+ status, res = Riddl::Client.new(@p[1].value).get
133
+ tdoc = if status >= 200 && status < 300
134
+ res[0].value.read
135
+ else
136
+ (@status = 500) && return
94
137
  end
95
138
 
96
- if (ins = Testset::load(tdoc,cpee)) == -1
139
+ if (instance = load_testset(tdoc,cpee)) == -1
97
140
  @status = 500
98
141
  else
99
- if @p[0].value =~ /^wait/
100
- @headers << Riddl::Header.new('CPEE_CALLBACK','true')
101
- cb = @h['CPEE_CALLBACK']
102
-
103
- if cb
104
- srv = Riddl::Client.new(cpee, cpee + "?riddl-description")
105
- status, response = srv.resource("/#{ins}/notifications/subscriptions/").post [
106
- Riddl::Parameter::Simple.new("topic","state"),
107
- Riddl::Parameter::Simple.new("events","change"),
108
- ]
109
- key = response.first.value
110
-
111
- srv.resource("/#{ins}/notifications/subscriptions/#{key}/ws/").ws do |conn|
112
- conn.on :message do |msg|
113
- if JSON::parse(XML::Smart::string(msg.data).find('string(/event/notification)'))['state'] == 'finished'
114
- conn.close
115
- Riddl::Client.new(cb).put [
116
- # TODO extract all dataelements from instance
117
- Riddl::Parameter::Simple.new('instance',ins)
118
- ]
119
- end
120
- end
121
- end
122
- end
123
- end
124
- if @p.length > 1 && @p[0].value =~ /_running$/
125
- srv = Riddl::Client.new(cpee, cpee + "?riddl-description")
126
- res = srv.resource("/#{ins}/properties/values")
127
- status, response = res.put [
128
- Riddl::Parameter::Simple.new('name', 'state'),
129
- Riddl::Parameter::Simple.new('value','running')
130
- ]
131
- end
132
- return Riddl::Parameter::Simple.new("url",cpee + ins)
142
+ handle_data cpee, instance, @p[2]&.value
143
+ handle_waiting cpee, instance, @p[0].value
144
+ handle_starting cpee, instance, @p[0].value
145
+ return Riddl::Parameter::Simple.new("url",cpee + instance)
133
146
  end
134
147
  end
135
- end
148
+ end #}}}
149
+
150
+ class InstantiateXML < Riddl::Implementation #{{{
151
+ include Helpers
152
+
153
+ def response
154
+ cpee = @a[0]
155
+ behavior = @a[1] ? 'fork_ready' : @p[0].value
156
+ data = @a[1] ? 0 : 1
157
+ tdoc = if @p[data].additional =~ /base64/
158
+ Base64.decode64(@p[data].value.read)
159
+ else
160
+ @p[data].value.read
161
+ end
162
+
163
+ if (instance = load_testset(tdoc,cpee)) == -1
164
+ @status = 500
165
+ else
166
+ handle_data cpee, instance, @p[data+1]&.value
167
+ handle_waiting cpee, instance, behavior
168
+ handle_starting cpee, instance, behavior
169
+ return Riddl::Parameter::Simple.new("url",cpee + instance)
170
+ end
171
+ end
172
+ end #}}}
173
+
174
+ class HandleInstance < Riddl::Implementation #{{{
175
+ include Helpers
176
+
177
+ def response
178
+ cpee = @a[0]
179
+ instance = @p[1].value
180
+
181
+ handle_data cpee, instance, @p[2]&.value
182
+ handle_waiting cpee, instance, @p[0].value
183
+ handle_starting cpee, instance, @p[0].value
184
+ return Riddl::Parameter::Simple.new("url",cpee + instance)
185
+ end
186
+ end #}}}
136
187
 
137
188
  def self::implementation(opts)
138
189
  opts[:cpee] ||= 'http://localhost:9298/'
139
190
  Proc.new do
140
191
  on resource do
141
- run Instantiate, opts[:cpee] if post 'instantiate'
192
+ run InstantiateXML, opts[:cpee],true if post 'xmlsimple'
193
+ on resource 'xml' do
194
+ run InstantiateXML, opts[:cpee], false if post 'xml'
195
+ end
196
+ on resource 'url' do
197
+ run InstantiateUrl, opts[:cpee] if post 'url'
198
+ end
199
+ on resource 'instance' do
200
+ run HandleInstance, opts[:cpee] if post 'instance'
201
+ end
142
202
  end
143
203
  end
144
204
  end
@@ -1,28 +1,68 @@
1
1
  <description datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes" xmlns="http://riddl.org/ns/description/1.0" xmlns:xi="http://www.w3.org/2001/XInclude">
2
2
 
3
- <message name="instantiate">
3
+ <message name="xmlsimple">
4
+ <parameter name="xml" mimetype="*/xml"/>
5
+ </message>
6
+ <message name="xml">
7
+ <parameter name="behavior" type="string">
8
+ <choice>
9
+ <value>fork_ready</value>
10
+ <value>fork_running</value>
11
+ <value>wait_ready</value>
12
+ <value>wait_running</value>
13
+ </choice>
14
+ </parameter>
15
+ <parameter name="xml" mimetype="*/xml"/>
4
16
  <optional>
5
- <parameter name="behavior" type="string">
6
- <choice>
7
- <value>fork_ready</value>
8
- <value>fork_running</value>
9
- <value>wait_ready</value>
10
- <value>wait_running</value>
11
- </choice>
12
- </parameter>
17
+ <parameter name="init" type="string"/>
18
+ </optional>
19
+ </message>
20
+ <message name="url">
21
+ <parameter name="behavior" type="string">
22
+ <choice>
23
+ <value>fork_ready</value>
24
+ <value>fork_running</value>
25
+ <value>wait_ready</value>
26
+ <value>wait_running</value>
27
+ </choice>
28
+ </parameter>
29
+ <parameter name="url" type="string"/>
30
+ <optional>
31
+ <parameter name="init" type="string"/>
13
32
  </optional>
14
- <choice>
15
- <parameter name="xml" mimetype="*/xml"/>
16
- <parameter name="url" type="string"/>
17
- </choice>
18
33
  </message>
19
-
20
34
  <message name="instance">
35
+ <parameter name="behavior" type="string">
36
+ <choice>
37
+ <value>fork_ready</value>
38
+ <value>fork_running</value>
39
+ <value>wait_ready</value>
40
+ <value>wait_running</value>
41
+ <value>wait_stopped_running</value>
42
+ <value>wait_finished_running</value>
43
+ </choice>
44
+ </parameter>
45
+ <parameter name="instance" type="integer"/>
46
+ <optional>
47
+ <parameter name="init" type="string"/>
48
+ </optional>
49
+ </message>
50
+
51
+ <message name="result">
21
52
  <parameter name="url" type="anyURI"/>
22
53
  </message>
23
54
 
24
55
  <resource>
25
- <post in="instantiate" out="instance"/>
56
+ <post in="xmlsimple" out="result"/>
57
+ <resource relative="xml">
58
+ <post in="xml" out="result"/>
59
+ </resource>
60
+ <resource relative="instance">
61
+ <post in="instance" out="result"/>
62
+ </resource>
63
+ <resource relative="url">
64
+ <post in="url" out="result"/>
65
+ </resource>
26
66
  </resource>
27
67
 
28
68
  </description>