cpee 2.0.11 → 2.0.17

Sign up to get free protection for your applications and to get access to all the features.
Files changed (139) hide show
  1. checksums.yaml +4 -4
  2. data/cockpit/css/track.css +7 -0
  3. data/cockpit/css/ui.css +2 -3
  4. data/cockpit/index.html +2 -1
  5. data/cockpit/js/instance.js +15 -7
  6. data/cockpit/js/model.js +1 -1
  7. data/cockpit/js/ui.js +1 -1
  8. data/cockpit/templates/Track Test.xml +1 -1
  9. data/cockpit/templates/{BPM 2020 Manual Adjust.xml → UR-VUE 2020 Manual Adjust.xml } +1 -1
  10. data/cockpit/templates/{BPM 2020 Solution Baseline.xml → UR-VUE 2020 Solution Baseline.xml } +10 -3
  11. data/cockpit/templates/{BPM 2020 Solution NN.xml → UR-VUE 2020 Solution NN.xml } +1 -1
  12. data/cockpit/templates/{BPM 2020 Solution View.xml → UR-VUE 2020 Solution View.xml } +8 -1
  13. data/cockpit/templates/UR-VUE 2020.xml +26 -0
  14. data/cockpit/templates/instantiate.local/Take_Sub.xml +2 -4
  15. data/cockpit/templates/instantiate/Take_Sub.xml +2 -1
  16. data/cockpit/templates/instantiate/Take_X.xml +1 -1
  17. data/cockpit/themes/compact/rngs/closed_loop.rng +62 -0
  18. data/cockpit/themes/compact/rngs/closed_loop_cancel.rng +5 -0
  19. data/cockpit/themes/compact/rngs/closed_loop_control.rng +31 -0
  20. data/cockpit/themes/compact/rngs/closed_loop_measuring.rng +12 -0
  21. data/cockpit/themes/compact/rngs/loop.rng +1 -1
  22. data/cockpit/themes/compact/rngs/parallel.rng +1 -1
  23. data/cockpit/themes/compact/symbols/closed_loop.svg +5 -0
  24. data/cockpit/themes/compact/symbols/closed_loop_cancel.svg +5 -0
  25. data/cockpit/themes/compact/symbols/closed_loop_control.svg +5 -0
  26. data/cockpit/themes/compact/symbols/closed_loop_measuring.svg +6 -0
  27. data/cockpit/themes/default/rngs/closed_loop.rng +62 -0
  28. data/cockpit/themes/default/rngs/closed_loop_cancel.rng +5 -0
  29. data/cockpit/themes/default/rngs/closed_loop_control.rng +31 -0
  30. data/cockpit/themes/default/rngs/closed_loop_measuring.rng +12 -0
  31. data/cockpit/themes/default/rngs/loop.rng +1 -1
  32. data/cockpit/themes/default/rngs/parallel.rng +1 -1
  33. data/cockpit/themes/default/symbols/closed_loop.svg +5 -0
  34. data/cockpit/themes/default/symbols/closed_loop_cancel.svg +5 -0
  35. data/cockpit/themes/default/symbols/closed_loop_control.svg +5 -0
  36. data/cockpit/themes/default/symbols/closed_loop_measuring.svg +6 -0
  37. data/cockpit/themes/diana/rngs/alternative.rng +25 -0
  38. data/cockpit/themes/diana/rngs/call.rng +122 -0
  39. data/cockpit/themes/diana/rngs/callmanipulate.rng +145 -0
  40. data/cockpit/themes/diana/rngs/choose.rng +14 -0
  41. data/cockpit/themes/diana/rngs/closed_loop.rng +62 -0
  42. data/cockpit/themes/diana/rngs/closed_loop_cancel.rng +5 -0
  43. data/cockpit/themes/diana/rngs/closed_loop_control.rng +31 -0
  44. data/cockpit/themes/diana/rngs/closed_loop_measuring.rng +12 -0
  45. data/cockpit/themes/diana/rngs/critical.rng +5 -0
  46. data/cockpit/themes/diana/rngs/escape.rng +1 -0
  47. data/cockpit/themes/diana/rngs/group.rng +3 -0
  48. data/cockpit/themes/diana/rngs/loop.rng +22 -0
  49. data/cockpit/themes/diana/rngs/manipulate.rng +9 -0
  50. data/cockpit/themes/diana/rngs/otherwise.rng +22 -0
  51. data/cockpit/themes/diana/rngs/parallel.rng +21 -0
  52. data/cockpit/themes/diana/rngs/parallel_branch.rng +8 -0
  53. data/cockpit/themes/diana/rngs/scripts.rng +23 -0
  54. data/cockpit/themes/diana/rngs/stop.rng +5 -0
  55. data/cockpit/themes/diana/rngs/terminate.rng +1 -0
  56. data/cockpit/themes/diana/symbols/alternative.svg +5 -0
  57. data/cockpit/themes/diana/symbols/arrow.svg +3 -0
  58. data/cockpit/themes/diana/symbols/call.svg +6 -0
  59. data/cockpit/themes/diana/symbols/callmanipulate.svg +8 -0
  60. data/cockpit/themes/diana/symbols/choose.svg +5 -0
  61. data/cockpit/themes/diana/symbols/choose_exclusive.svg +5 -0
  62. data/cockpit/themes/diana/symbols/choose_inclusive.svg +4 -0
  63. data/cockpit/themes/diana/symbols/closed_loop.svg +5 -0
  64. data/cockpit/themes/diana/symbols/closed_loop_cancel.svg +5 -0
  65. data/cockpit/themes/diana/symbols/closed_loop_control.svg +5 -0
  66. data/cockpit/themes/diana/symbols/closed_loop_measuring.svg +6 -0
  67. data/cockpit/themes/diana/symbols/complex.svg +8 -0
  68. data/cockpit/themes/diana/symbols/critical.svg +4 -0
  69. data/cockpit/themes/diana/symbols/end.svg +3 -0
  70. data/cockpit/themes/diana/symbols/escape.svg +5 -0
  71. data/cockpit/themes/diana/symbols/event_end.svg +3 -0
  72. data/cockpit/themes/diana/symbols/loop.svg +5 -0
  73. data/cockpit/themes/diana/symbols/manipulate.svg +4 -0
  74. data/cockpit/themes/diana/symbols/otherwise.svg +5 -0
  75. data/cockpit/themes/diana/symbols/parallel.svg +5 -0
  76. data/cockpit/themes/diana/symbols/parallel_branch.svg +5 -0
  77. data/cockpit/themes/diana/symbols/parallel_branch_compact.svg +4 -0
  78. data/cockpit/themes/diana/symbols/parallel_branch_event.svg +14 -0
  79. data/cockpit/themes/diana/symbols/parallel_branch_normal.svg +5 -0
  80. data/cockpit/themes/diana/symbols/scripts.svg +4 -0
  81. data/cockpit/themes/diana/symbols/start.svg +3 -0
  82. data/cockpit/themes/diana/symbols/stop.svg +5 -0
  83. data/cockpit/themes/diana/symbols/terminate.svg +4 -0
  84. data/cockpit/themes/diana/theme.js +1650 -0
  85. data/cockpit/themes/extended/rngs/closed_loop.rng +62 -0
  86. data/cockpit/themes/extended/rngs/closed_loop_cancel.rng +5 -0
  87. data/cockpit/themes/extended/rngs/closed_loop_control.rng +31 -0
  88. data/cockpit/themes/extended/rngs/closed_loop_measuring.rng +12 -0
  89. data/cockpit/themes/extended/rngs/loop.rng +1 -1
  90. data/cockpit/themes/extended/rngs/parallel.rng +1 -1
  91. data/cockpit/themes/extended/symbols/closed_loop.svg +5 -0
  92. data/cockpit/themes/extended/symbols/closed_loop_cancel.svg +5 -0
  93. data/cockpit/themes/extended/symbols/closed_loop_control.svg +5 -0
  94. data/cockpit/themes/extended/symbols/closed_loop_measuring.svg +6 -0
  95. data/cockpit/themes/extended/theme.js +4 -0
  96. data/cockpit/themes/model/rngs/call.rng +5 -1
  97. data/cockpit/themes/model/rngs/callmanipulate.rng +5 -1
  98. data/cockpit/themes/model/symbols/closed_loop.svg +5 -0
  99. data/cockpit/themes/model/symbols/closed_loop_cancel.svg +5 -0
  100. data/cockpit/themes/model/symbols/closed_loop_control.svg +5 -0
  101. data/cockpit/themes/model/symbols/closed_loop_measuring.svg +6 -0
  102. data/cockpit/themes/packed/rngs/closed_loop.rng +62 -0
  103. data/cockpit/themes/packed/rngs/closed_loop_cancel.rng +5 -0
  104. data/cockpit/themes/packed/rngs/closed_loop_control.rng +31 -0
  105. data/cockpit/themes/packed/rngs/closed_loop_measuring.rng +12 -0
  106. data/cockpit/themes/packed/rngs/loop.rng +1 -1
  107. data/cockpit/themes/packed/rngs/parallel.rng +1 -1
  108. data/cockpit/themes/packed/symbols/closed_loop.svg +5 -0
  109. data/cockpit/themes/packed/symbols/closed_loop_cancel.svg +5 -0
  110. data/cockpit/themes/packed/symbols/closed_loop_control.svg +5 -0
  111. data/cockpit/themes/packed/symbols/closed_loop_measuring.svg +6 -0
  112. data/cockpit/themes/preset/rngs/closed_loop.rng +62 -0
  113. data/cockpit/themes/preset/rngs/closed_loop_cancel.rng +5 -0
  114. data/cockpit/themes/preset/rngs/closed_loop_control.rng +31 -0
  115. data/cockpit/themes/preset/rngs/closed_loop_measuring.rng +12 -0
  116. data/cockpit/themes/preset/rngs/loop.rng +1 -1
  117. data/cockpit/themes/preset/rngs/parallel.rng +1 -1
  118. data/cockpit/themes/preset/symbols/closed_loop.svg +5 -0
  119. data/cockpit/themes/preset/symbols/closed_loop_cancel.svg +5 -0
  120. data/cockpit/themes/preset/symbols/closed_loop_control.svg +5 -0
  121. data/cockpit/themes/preset/symbols/closed_loop_measuring.svg +6 -0
  122. data/cockpit/themes/preset/theme.js +1 -1
  123. data/cockpit/track.html +1 -1
  124. data/cpee.gemspec +1 -1
  125. data/lib/cpee/controller.rb +3 -2
  126. data/lib/cpee/implementation.rb +1 -1
  127. data/lib/cpee/implementation_notifications.rb +14 -18
  128. data/lib/cpee/implementation_properties.rb +5 -2
  129. data/server/handlerwrappers/default.rb +19 -20
  130. data/server/routing/forward-votes.rb +5 -1
  131. data/tools/cpee +1 -1
  132. data/tools/server/{server.rb → cpee} +1 -0
  133. metadata +100 -13
  134. data/cockpit/templates/BPM 2020.xml +0 -26
  135. data/server/routing/end.pid +0 -1
  136. data/server/routing/forward-events.pid +0 -1
  137. data/server/routing/forward-votes.pid +0 -1
  138. data/server/routing/persist.pid +0 -1
  139. data/server/server.pid +0 -1
@@ -0,0 +1,5 @@
1
+ <element xmlns="http://relaxng.org/ns/structure/1.0" xmlns:rngui="http://rngui.org" rngui:version="1.2" ns="http://cpee.org/ns/description/1.0" name="closed_loop_cancel" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
2
+ <attribute name="condition" rngui:label="Condition">
3
+ <data type="string" rngui:label="Condition"/>
4
+ </attribute>
5
+ </element>
@@ -0,0 +1,31 @@
1
+ <element xmlns="http://relaxng.org/ns/structure/1.0" xmlns:rngui="http://rngui.org" rngui:version="1.2" ns="http://cpee.org/ns/description/1.0" name="closed_loop_control" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
2
+ <attribute name="frequency" rngui:label="Interval frequency in Hz" rngui:default="0.1">
3
+ <data type="float" rngui:label="Hz"/>
4
+ </attribute>
5
+ <element name="_expected" rngui:header="Values Expected to Change">
6
+ <zeroOrMore rngui:label="Add Value">
7
+ <element name="change">
8
+ <element name="type" rngui:label="Control type">
9
+ <choice>
10
+ <value>:PID</value>
11
+ <value>:PI</value>
12
+ <value>:PD</value>
13
+ <value>:P</value>
14
+ <value>:I</value>
15
+ <value>:PT1</value>
16
+ <value>:PT2</value>
17
+ </choice>
18
+ </element>
19
+ <element name="value" rngui:label="Value">
20
+ <data type="string" rngui:label="a dataelement"/>
21
+ </element>
22
+ <element name="upper" rngui:label="Upper Limit">
23
+ <data type="float" rngui:label="Max value after next measure"/>
24
+ </element>
25
+ <element name="lower" rngui:label="Lower Limit">
26
+ <data type="float" rngui:label="Min value after next measure"/>
27
+ </element>
28
+ </element>
29
+ </zeroOrMore>
30
+ </element>
31
+ </element>
@@ -0,0 +1,12 @@
1
+ <element xmlns="http://relaxng.org/ns/structure/1.0" xmlns:rngui="http://rngui.org" rngui:version="1.2" ns="http://cpee.org/ns/description/1.0" name="closed_loop_measuring" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
2
+ <attribute name="frequency" rngui:label="Interval frequency in Hz" rngui:default="0.1">
3
+ <data type="float" rngui:label="Hz"/>
4
+ </attribute>
5
+ <element name="_expected" rngui:header="Values Expected to Change">
6
+ <zeroOrMore rngui:label="Add Value">
7
+ <element name="value" rngui:label="Value">
8
+ <data type="string" rngui:label="a dataelement"/>
9
+ </element>
10
+ </zeroOrMore>
11
+ </element>
12
+ </element>
@@ -19,4 +19,4 @@
19
19
  <data type="nonNegativeInteger" rngui:label="Times"/>
20
20
  </element>
21
21
  </element>
22
- </element>
22
+ </element>
@@ -18,4 +18,4 @@
18
18
  <data type="string"/>
19
19
  </attribute>
20
20
  </element>
21
- </element>
21
+ </element>
@@ -0,0 +1,5 @@
1
+ <svg class="clickable" xmlns="http://www.w3.org/2000/svg">
2
+ <rect transform="rotate(45,14,12)" x="7" y="3" width="21" height="21" class="cline hfill stand"/>
3
+ <path d="m 17.620194,6.2873424 c 7.577463,7.5774646 -7.577463,10.5124376 0,18.0898996" class="stand" style="fill-opacity: 0"/>
4
+ <path d="m 14.036033,6.2873424 c 7.577463,7.5774646 -7.5774629,10.5124376 0,18.0898996" class="stand" style="fill-opacity: 0"/>
5
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg class="clickable" xmlns="http://www.w3.org/2000/svg">
2
+ <circle cx="15" cy="15" r="14" class="cline stand"/>
3
+ <circle cx="15" cy="15" r="11" class="rfill hfill cline stand"/>
4
+ <path d="M 7.8583963,10.061007 10.29692,7.6153325 15.17399,12.506704 20.051062,7.6153325 22.489583,10.06103 17.612536,14.952378 22.489583,19.84375 20.051062,22.289424 15.17399,17.398076 10.296942,22.289424 7.8583963,19.84375 12.735466,14.952378 Z" class="stand"/>
5
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg class="clickable" xmlns="http://www.w3.org/2000/svg">
2
+ <circle cx="15" cy="15" r="14" class="cline stand"/>
3
+ <circle cx="15" cy="15" r="11" class="rfill hfill cline stand"/>
4
+ <circle cx="15" cy="15" r="7" class="stand"/> <path d="M 17,17 19.84375,19.84375" class="black stand"/>
5
+ </svg>
@@ -0,0 +1,6 @@
1
+ <svg class="clickable" xmlns="http://www.w3.org/2000/svg">
2
+ <circle cx="15" cy="15" r="14" class="cline stand"/>
3
+ <circle cx="15" cy="15" r="11" class="rfill hfill cline stand"/>
4
+ <path d="M 14.904335,6.0646408 A 9.0152948,9.0152948 0 0 0 5.9550908,15.079625 H 23.985106 a 9.0152948,9.0152948 0 0 0 -9.015008,-9.0149842 9.0152948,9.0152948 0 0 0 -0.06567,0 z" class="standfat"/>
5
+ <path d="M 14.970098,15.079625 11.963937,10.870986" class="black stand"/>
6
+ </svg>
@@ -217,7 +217,7 @@ function WFAdaptorManifestation(adaptor) {
217
217
  self.adaptor.illustrator.get_elements().removeClass('selected');
218
218
  self.adaptor.illustrator.get_labels().removeClass('selected');
219
219
 
220
- if (e && e.ctrlKey) {
220
+ if (e && (e.ctrlKey || e.metaKey)) {
221
221
  if (save['state'] != "ready" && save['state'] != "stopped") { return false; }
222
222
  var tab = $('#dat_details');
223
223
  tab.empty();
@@ -92,7 +92,7 @@
92
92
  </a>
93
93
  </span>
94
94
  <span> - </span>
95
- <span id="title">Loading ...</span>
95
+ <span id="title">Loading ...</span><span> <a style='display:none' target='_blank' id='current-log'>L</a></span>
96
96
  </div>
97
97
  <div id='state'>
98
98
  <span id="state_any">
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "cpee"
3
- s.version = "2.0.11"
3
+ s.version = "2.0.17"
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."
@@ -89,7 +89,7 @@ module CPEE
89
89
  end
90
90
 
91
91
  def start
92
- if vote("state/change")
92
+ if vote("state/change", :state => 'running')
93
93
  @thread = @instance.start
94
94
  @thread.join
95
95
  else
@@ -126,6 +126,7 @@ module CPEE
126
126
  @redis.smembers("instance:#{id}/handlers/#{handler}").each do |client|
127
127
  voteid = Digest::MD5.hexdigest(Kernel::rand().to_s)
128
128
  content[:key] = voteid
129
+ content[:attributes] = attributes_translated
129
130
  content[:subscription] = client
130
131
  votes << voteid
131
132
  CPEE::Message::send(:vote,what,base,@id,uuid,info,content,@redis)
@@ -140,7 +141,7 @@ module CPEE
140
141
  index = message.index(' ')
141
142
  mess = message[index+1..-1]
142
143
  m = JSON.parse(mess)
143
- collect << (m['content'] == 'true' || false)
144
+ collect << ((m['content'] == true || m['content'] == 'true') || false)
144
145
  @votes.delete m['name']
145
146
  cancel_callback m['name']
146
147
  if collect.length >= votes.length
@@ -227,7 +227,7 @@ module CPEE
227
227
  end
228
228
  end rescue nil # all the ones that are not ok, are ignored
229
229
  end
230
- multi.set(File.join(instance, 'attributes', 'uuid'), SecureRandom.uuid)
230
+ multi.set(File.join(instance, 'attributes', 'uuid'), uuid)
231
231
  multi.zadd(File.join(instance, 'attributes'), -2, 'uuid')
232
232
  multi.set(File.join(instance, 'attributes', 'info'), name)
233
233
  multi.zadd(File.join(instance, 'attributes'), -1, 'info')
@@ -102,28 +102,24 @@ module CPEE
102
102
  end
103
103
  end #}}}
104
104
 
105
- class CreateSubscription < Riddl::Implementation #{{{
105
+ class CreateSubscription < Riddl::Implementation #{{{
106
106
  def response
107
107
  id = @a[0]
108
108
  opts = @a[1]
109
109
 
110
- if opts[:statemachine].readonly? id
111
- @status = 423
112
- else
113
- key = Digest::MD5.hexdigest(Kernel::rand().to_s)
110
+ key = Digest::MD5.hexdigest(Kernel::rand().to_s)
114
111
 
115
- url = @p[0].name == 'url' ? @p.shift.value : nil
116
- values = []
117
- while @p.length > 0
118
- topic = @p.shift.value
119
- base = @p.shift
120
- type = base.name
121
- values += base.value.split(',').map { |i| File.join(topic,type[0..-2],i) }
122
- end
123
- @header = CPEE::Persistence::set_handler(id,opts,key,url,values)
124
-
125
- Riddl::Parameter::Simple.new('key',key)
112
+ url = @p[0].name == 'url' ? @p.shift.value : nil
113
+ values = []
114
+ while @p.length > 0
115
+ topic = @p.shift.value
116
+ base = @p.shift
117
+ type = base.name
118
+ values += base.value.split(',').map { |i| File.join(topic,type[0..-2],i) }
126
119
  end
120
+ @header = CPEE::Persistence::set_handler(id,opts,key,url,values)
121
+
122
+ Riddl::Parameter::Simple.new('key',key)
127
123
  end
128
124
  end #}}}
129
125
 
@@ -180,7 +176,7 @@ module CPEE
180
176
  state = mess.dig('content','state')
181
177
  if state == 'finished' || state == 'abandoned'
182
178
  opts.dig(:sse_connections,mess.dig('instance').to_i)&.each do |key,sse|
183
- EM.add_timer(2) do # just to be sure that all messages arrived
179
+ 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)
184
180
  sse.close
185
181
  end
186
182
  end
@@ -202,7 +198,7 @@ module CPEE
202
198
  @opts = @a[1]
203
199
  @id = @a[0]
204
200
  @key = @r[-2]
205
- if !@opts[:statemachine].readonly?(@id) && CPEE::Persistence::exists_handler?(@id,@opts,@key)
201
+ if CPEE::Persistence::exists_handler?(@id,@opts,@key)
206
202
  @opts[:sse_connections][@id] ||= {}
207
203
  @opts[:sse_connections][@id][@key] = self
208
204
  true
@@ -660,8 +660,11 @@ module CPEE
660
660
  @status = 422 # semantic error
661
661
  else
662
662
  begin
663
- PutDescription::set(id,opts,@p[0].value.read)
664
- rescue
663
+ # force-encoding because johannes managed to sneak in ascii special characters. why the browser is not sanitizing it is beyond me.
664
+ PutDescription::set(id,opts,@p[0].value.read.force_encoding('UTF-8'))
665
+ rescue => e
666
+ puts e.message
667
+ puts e.backtrace
665
668
  @status = 400
666
669
  end
667
670
  end
@@ -24,11 +24,7 @@ class DefaultHandlerWrapper < WEEL::HandlerWrapperBase
24
24
 
25
25
  def self::inform_state_change(arguments,newstate) # {{{
26
26
  controller = arguments[0]
27
- controller.notify("state/change", :state => newstate, :timestamp => Time.now.xmlschema(3))
28
- end # }}}
29
- def self::inform_state_change(arguments,newstate) # {{{
30
- controller = arguments[0]
31
- controller.notify("state/change", :state => newstate, :timestamp => Time.now.xmlschema(3))
27
+ controller.notify("state/change", :state => newstate)
32
28
  end # }}}
33
29
  def self::inform_syntax_error(arguments,err,code)# {{{
34
30
  controller = arguments[0]
@@ -113,7 +109,7 @@ class DefaultHandlerWrapper < WEEL::HandlerWrapperBase
113
109
 
114
110
  client = Riddl::Client.new(tendpoint)
115
111
 
116
- @controller.callback(self,callback,:activity_uuid => @handler_activity_uuid, :label => @label, :activity => @handler_position)
112
+ @controller.callback(self,callback,:'activity_uuid' => @handler_activity_uuid, :label => @label, :activity => @handler_position)
117
113
  @handler_passthrough = callback
118
114
 
119
115
  status, result, headers = client.request type => params
@@ -124,7 +120,10 @@ class DefaultHandlerWrapper < WEEL::HandlerWrapperBase
124
120
  callback([ Riddl::Parameter::Complex.new('error','application/json',StringIO.new(JSON::generate({ 'status' => status, 'error' => c }))) ], headers)
125
121
  else
126
122
  if headers['CPEE_INSTANTIATION']
127
- @controller.notify("task/instantiation", :activity_uuid => @handler_activity_uuid, :label => @label, :activity => @handler_position, :endpoint => @handler_endpoint, :received => CPEE::ValueHelper.parse(headers['CPEE_INSTANTIATION']))
123
+ @controller.notify("task/instantiation", :'activity-uuid' => @handler_activity_uuid, :label => @label, :activity => @handler_position, :endpoint => @handler_endpoint, :received => CPEE::ValueHelper.parse(headers['CPEE_INSTANTIATION']))
124
+ end
125
+ if headers['CPEE_EVENT']
126
+ @controller.notify("task/#{headers['CPEE_EVENT'].gsub(/[^\w_-]/,'')}", :'activity_uuid' => @handler_activity_uuid, :label => @label, :activity => @handler_position, :endpoint => @handler_endpoint)
128
127
  end
129
128
  if headers['CPEE_CALLBACK'] && headers['CPEE_CALLBACK'] == 'true' && result.any?
130
129
  headers['CPEE_UPDATE'] = true
@@ -143,11 +142,11 @@ class DefaultHandlerWrapper < WEEL::HandlerWrapperBase
143
142
  @sensors = parameters.dig(:stream,:sensors)
144
143
  @aggregators = parameters.dig(:stream,:aggregators)
145
144
  @costs = parameters.dig(:stream,:costs)
146
- @controller.notify("activity/calling", :activity_uuid => @handler_activity_uuid, :label => @label, :activity => @handler_position, :passthrough => passthrough, :endpoint => @handler_endpoint, :parameters => parameters)
145
+ @controller.notify("activity/calling", :'activity_uuid' => @handler_activity_uuid, :label => @label, :activity => @handler_position, :passthrough => passthrough, :endpoint => @handler_endpoint, :parameters => parameters)
147
146
  if passthrough.to_s.empty?
148
147
  proto_curl parameters
149
148
  else
150
- @controller.callback(self,passthrough,:activity_uuid => @handler_activity_uuid, :label => @label, :activity => @handler_position)
149
+ @controller.callback(self,passthrough,:'activity_uuid' => @handler_activity_uuid, :label => @label, :activity => @handler_position)
151
150
  @handler_passthrough = passthrough
152
151
  end
153
152
  end # }}}
@@ -176,33 +175,33 @@ class DefaultHandlerWrapper < WEEL::HandlerWrapperBase
176
175
  end # }}}
177
176
 
178
177
  def inform_activity_done # {{{
179
- @controller.notify("activity/done", :activity_uuid => @handler_activity_uuid, :endpoint => @handler_endpoint, :label => @label, :activity => @handler_position)
178
+ @controller.notify("activity/done", :'activity_uuid' => @handler_activity_uuid, :endpoint => @handler_endpoint, :label => @label, :activity => @handler_position)
180
179
  end # }}}
181
180
  def inform_activity_manipulate # {{{
182
- @controller.notify("activity/manipulating", :activity_uuid => @handler_activity_uuid, :endpoint => @handler_endpoint, :label => @label, :activity => @handler_position)
181
+ @controller.notify("activity/manipulating", :'activity_uuid' => @handler_activity_uuid, :endpoint => @handler_endpoint, :label => @label, :activity => @handler_position)
183
182
  end # }}}
184
183
  def inform_activity_failed(err) # {{{
185
184
  puts err.message
186
185
  puts err.backtrace
187
- @controller.notify("activity/failed", :activity_uuid => @handler_activity_uuid, :endpoint => @handler_endpoint, :label => @label, :activity => @handler_position, :message => err.message, :line => err.backtrace[0].match(/(.*?):(\d+):/)[2], :where => err.backtrace[0].match(/(.*?):(\d+):/)[1])
186
+ @controller.notify("activity/failed", :'activity_uuid' => @handler_activity_uuid, :endpoint => @handler_endpoint, :label => @label, :activity => @handler_position, :message => err.message, :line => err.backtrace[0].match(/(.*?):(\d+):/)[2], :where => err.backtrace[0].match(/(.*?):(\d+):/)[1])
188
187
  end # }}}
189
188
  def inform_manipulate_change(status,changed_dataelements,changed_endpoints,dataelements,endpoints) # {{{
190
189
  unless status.nil?
191
- @controller.notify("status/change", :activity_uuid => @handler_activity_uuid, :endpoint => @handler_endpoint, :label => @label, :activity => @handler_position, :id => status.id, :message => status.message)
190
+ @controller.notify("status/change", :'activity_uuid' => @handler_activity_uuid, :endpoint => @handler_endpoint, :label => @label, :activity => @handler_position, :id => status.id, :message => status.message)
192
191
  end
193
192
  unless changed_dataelements.nil?
194
- @controller.notify("dataelements/change", :activity_uuid => @handler_activity_uuid, :endpoint => @handler_endpoint, :label => @label, :activity => @handler_position, :changed => changed_dataelements, :values => dataelements)
193
+ @controller.notify("dataelements/change", :'activity_uuid' => @handler_activity_uuid, :endpoint => @handler_endpoint, :label => @label, :activity => @handler_position, :changed => changed_dataelements, :values => dataelements)
195
194
  end
196
195
  unless changed_endpoints.nil?
197
- @controller.notify("endpoints/change", :activity_uuid => @handler_activity_uuid, :endpoint => @handler_endpoint, :label => @label, :activity => @handler_position, :changed => changed_endpoints, :values => endpoints)
196
+ @controller.notify("endpoints/change", :'activity_uuid' => @handler_activity_uuid, :endpoint => @handler_endpoint, :label => @label, :activity => @handler_position, :changed => changed_endpoints, :values => endpoints)
198
197
  end
199
198
  end # }}}
200
199
 
201
200
  def vote_sync_after # {{{
202
- @controller.vote("activity/syncing_after", :activity_uuid => @handler_activity_uuid, :endpoint => @handler_endpoint, :activity => @handler_position, :label => @label)
201
+ @controller.vote("activity/syncing_after", :'activity_uuid' => @handler_activity_uuid, :endpoint => @handler_endpoint, :activity => @handler_position, :label => @label)
203
202
  end # }}}
204
203
  def vote_sync_before(parameters=nil) # {{{
205
- @controller.vote("activity/syncing_before", :activity_uuid => @handler_activity_uuid, :endpoint => @handler_endpoint, :activity => @handler_position, :label => @label, :parameters => parameters)
204
+ @controller.vote("activity/syncing_before", :'activity_uuid' => @handler_activity_uuid, :endpoint => @handler_endpoint, :activity => @handler_position, :label => @label, :parameters => parameters)
206
205
  end # }}}
207
206
 
208
207
  def simplify_result(result)
@@ -261,13 +260,13 @@ class DefaultHandlerWrapper < WEEL::HandlerWrapperBase
261
260
  end
262
261
 
263
262
  def callback(result=nil,options={})
264
- @controller.notify("activity/receiving", :activity_uuid => @handler_activity_uuid, :label => @label, :activity => @handler_position, :endpoint => @handler_endpoint, :received => structurize_result(result), :sensors => @sensors, :aggregators => @aggregators, :costs => @costs)
263
+ @controller.notify("activity/receiving", :'activity_uuid' => @handler_activity_uuid, :label => @label, :activity => @handler_position, :endpoint => @handler_endpoint, :received => structurize_result(result), :sensors => @sensors, :aggregators => @aggregators, :costs => @costs)
265
264
  result = simplify_result(result)
266
265
  @handler_returnValue = result
267
266
  @handler_returnOptions = options
268
267
  if options['CPEE_UPDATE']
269
268
  if options['CPEE_UPDATE_STATUS']
270
- @controller.notify("activity/status", :activity_uuid => @handler_activity_uuid, :label => @label, :activity => @handler_position, :endpoint => @handler_endpoint, :status => options['CPEE_UPDATE_STATUS'])
269
+ @controller.notify("activity/status", :'activity_uuid' => @handler_activity_uuid, :label => @label, :activity => @handler_position, :endpoint => @handler_endpoint, :status => options['CPEE_UPDATE_STATUS'])
271
270
  end
272
271
  @handler_continue.continue WEEL::Signal::Again
273
272
  else
@@ -291,7 +290,7 @@ class DefaultHandlerWrapper < WEEL::HandlerWrapperBase
291
290
  pp "#{type} - #{nesting} - #{tid} - #{parent} - #{parameters.inspect}"
292
291
 
293
292
  @controller.vote("simulating/step",
294
- :activity_uuid => @handler_activity_uuid,
293
+ :'activity_uuid' => @handler_activity_uuid,
295
294
  :label => @label,
296
295
  :activity => tid,
297
296
  :endpoint => @handler_endpoint,
@@ -86,7 +86,11 @@ Daemonite.new do |opts|
86
86
  Riddl::Parameter::Complex::new('notification','application/json',mess)
87
87
  ] rescue [ 0, [], []])
88
88
  if status >= 200 && status < 300
89
- val = result[0].value.read
89
+ val = if result[0].class == Riddl::Parameter::Simple
90
+ result[0].value
91
+ else
92
+ result[0].value.read
93
+ end
90
94
  if (headers["CPEE_CALLBACK"] && headers["CPEE_CALLBACK"] == 'true') || val == 'callback'
91
95
  persist_handler instance, callback_key, m, redis
92
96
  else # they may send true or false
data/tools/cpee CHANGED
@@ -65,7 +65,7 @@ p2 = ARGV[2]
65
65
  cockpit = "#{curpath}/../cockpit/"
66
66
 
67
67
  def js_libs(cockpit)
68
- res = Typhoeus.get('http://cpee.org/js_libs/js_libs.zip')
68
+ res = Typhoeus.get('https://cpee.org/js_libs/js_libs.zip')
69
69
  if res.success?
70
70
  File.write(File.join(cockpit,'js_libs.zip'),res.response_body)
71
71
  Zip::File.open(File.join(cockpit,'js_libs.zip')) do |zip_file|
@@ -10,6 +10,7 @@ Riddl::Server.new(CPEE::SERVER, :host => 'localhost', :port => 8298) do |opts|
10
10
 
11
11
  accessible_description true
12
12
  cross_site_xhr true
13
+ process_out false
13
14
 
14
15
  use CPEE::implementation(opts)
15
16
  end.loop!
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cpee
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.11
4
+ version: 2.0.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Juergen eTM Mangler
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: tools
12
12
  cert_chain: []
13
- date: 2020-10-23 00:00:00.000000000 Z
13
+ date: 2020-11-19 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: riddl
@@ -185,17 +185,17 @@ files:
185
185
  - cockpit/templates.legacy/convert_preset.rb
186
186
  - cockpit/templates.legacy/testsets.xml
187
187
  - cockpit/templates.legacy/transformations.xml
188
- - cockpit/templates/BPM 2020 Manual Adjust.xml
189
- - cockpit/templates/BPM 2020 Solution Baseline.xml
190
- - cockpit/templates/BPM 2020 Solution NN.xml
191
- - cockpit/templates/BPM 2020 Solution View.xml
192
- - cockpit/templates/BPM 2020.xml
193
188
  - cockpit/templates/Coopis 2010.xml
194
189
  - cockpit/templates/IUPC arXiv:1104.3609 P34 1.xml
195
190
  - cockpit/templates/IUPC arXiv:1104.3609 P34 2.xml
196
191
  - cockpit/templates/IUPC arXiv:1104.3609 P34 3.xml
197
192
  - cockpit/templates/Track Test Local.xml
198
193
  - cockpit/templates/Track Test.xml
194
+ - cockpit/templates/UR-VUE 2020 Manual Adjust.xml
195
+ - cockpit/templates/UR-VUE 2020 Solution Baseline.xml
196
+ - cockpit/templates/UR-VUE 2020 Solution NN.xml
197
+ - cockpit/templates/UR-VUE 2020 Solution View.xml
198
+ - cockpit/templates/UR-VUE 2020.xml
199
199
  - cockpit/templates/Worklist.xml
200
200
  - cockpit/templates/instantiate.local/Take_Sub.xml
201
201
  - cockpit/templates/instantiate/Take_Perf.xml
@@ -205,6 +205,10 @@ files:
205
205
  - cockpit/themes/compact/rngs/call.rng
206
206
  - cockpit/themes/compact/rngs/callmanipulate.rng
207
207
  - cockpit/themes/compact/rngs/choose.rng
208
+ - cockpit/themes/compact/rngs/closed_loop.rng
209
+ - cockpit/themes/compact/rngs/closed_loop_cancel.rng
210
+ - cockpit/themes/compact/rngs/closed_loop_control.rng
211
+ - cockpit/themes/compact/rngs/closed_loop_measuring.rng
208
212
  - cockpit/themes/compact/rngs/critical.rng
209
213
  - cockpit/themes/compact/rngs/escape.rng
210
214
  - cockpit/themes/compact/rngs/group.rng
@@ -223,6 +227,10 @@ files:
223
227
  - cockpit/themes/compact/symbols/choose.svg
224
228
  - cockpit/themes/compact/symbols/choose_exclusive.svg
225
229
  - cockpit/themes/compact/symbols/choose_inclusive.svg
230
+ - cockpit/themes/compact/symbols/closed_loop.svg
231
+ - cockpit/themes/compact/symbols/closed_loop_cancel.svg
232
+ - cockpit/themes/compact/symbols/closed_loop_control.svg
233
+ - cockpit/themes/compact/symbols/closed_loop_measuring.svg
226
234
  - cockpit/themes/compact/symbols/complex.svg
227
235
  - cockpit/themes/compact/symbols/critical.svg
228
236
  - cockpit/themes/compact/symbols/end.svg
@@ -245,6 +253,10 @@ files:
245
253
  - cockpit/themes/default/rngs/call.rng
246
254
  - cockpit/themes/default/rngs/callmanipulate.rng
247
255
  - cockpit/themes/default/rngs/choose.rng
256
+ - cockpit/themes/default/rngs/closed_loop.rng
257
+ - cockpit/themes/default/rngs/closed_loop_cancel.rng
258
+ - cockpit/themes/default/rngs/closed_loop_control.rng
259
+ - cockpit/themes/default/rngs/closed_loop_measuring.rng
248
260
  - cockpit/themes/default/rngs/critical.rng
249
261
  - cockpit/themes/default/rngs/escape.rng
250
262
  - cockpit/themes/default/rngs/group.rng
@@ -263,6 +275,10 @@ files:
263
275
  - cockpit/themes/default/symbols/choose.svg
264
276
  - cockpit/themes/default/symbols/choose_exclusive.svg
265
277
  - cockpit/themes/default/symbols/choose_inclusive.svg
278
+ - cockpit/themes/default/symbols/closed_loop.svg
279
+ - cockpit/themes/default/symbols/closed_loop_cancel.svg
280
+ - cockpit/themes/default/symbols/closed_loop_control.svg
281
+ - cockpit/themes/default/symbols/closed_loop_measuring.svg
266
282
  - cockpit/themes/default/symbols/complex.svg
267
283
  - cockpit/themes/default/symbols/critical.svg
268
284
  - cockpit/themes/default/symbols/end.svg
@@ -280,10 +296,62 @@ files:
280
296
  - cockpit/themes/default/symbols/start.svg
281
297
  - cockpit/themes/default/symbols/stop.svg
282
298
  - cockpit/themes/default/symbols/terminate.svg
299
+ - cockpit/themes/diana/rngs/alternative.rng
300
+ - cockpit/themes/diana/rngs/call.rng
301
+ - cockpit/themes/diana/rngs/callmanipulate.rng
302
+ - cockpit/themes/diana/rngs/choose.rng
303
+ - cockpit/themes/diana/rngs/closed_loop.rng
304
+ - cockpit/themes/diana/rngs/closed_loop_cancel.rng
305
+ - cockpit/themes/diana/rngs/closed_loop_control.rng
306
+ - cockpit/themes/diana/rngs/closed_loop_measuring.rng
307
+ - cockpit/themes/diana/rngs/critical.rng
308
+ - cockpit/themes/diana/rngs/escape.rng
309
+ - cockpit/themes/diana/rngs/group.rng
310
+ - cockpit/themes/diana/rngs/loop.rng
311
+ - cockpit/themes/diana/rngs/manipulate.rng
312
+ - cockpit/themes/diana/rngs/otherwise.rng
313
+ - cockpit/themes/diana/rngs/parallel.rng
314
+ - cockpit/themes/diana/rngs/parallel_branch.rng
315
+ - cockpit/themes/diana/rngs/scripts.rng
316
+ - cockpit/themes/diana/rngs/stop.rng
317
+ - cockpit/themes/diana/rngs/terminate.rng
318
+ - cockpit/themes/diana/symbols/alternative.svg
319
+ - cockpit/themes/diana/symbols/arrow.svg
320
+ - cockpit/themes/diana/symbols/call.svg
321
+ - cockpit/themes/diana/symbols/callmanipulate.svg
322
+ - cockpit/themes/diana/symbols/choose.svg
323
+ - cockpit/themes/diana/symbols/choose_exclusive.svg
324
+ - cockpit/themes/diana/symbols/choose_inclusive.svg
325
+ - cockpit/themes/diana/symbols/closed_loop.svg
326
+ - cockpit/themes/diana/symbols/closed_loop_cancel.svg
327
+ - cockpit/themes/diana/symbols/closed_loop_control.svg
328
+ - cockpit/themes/diana/symbols/closed_loop_measuring.svg
329
+ - cockpit/themes/diana/symbols/complex.svg
330
+ - cockpit/themes/diana/symbols/critical.svg
331
+ - cockpit/themes/diana/symbols/end.svg
332
+ - cockpit/themes/diana/symbols/escape.svg
333
+ - cockpit/themes/diana/symbols/event_end.svg
334
+ - cockpit/themes/diana/symbols/loop.svg
335
+ - cockpit/themes/diana/symbols/manipulate.svg
336
+ - cockpit/themes/diana/symbols/otherwise.svg
337
+ - cockpit/themes/diana/symbols/parallel.svg
338
+ - cockpit/themes/diana/symbols/parallel_branch.svg
339
+ - cockpit/themes/diana/symbols/parallel_branch_compact.svg
340
+ - cockpit/themes/diana/symbols/parallel_branch_event.svg
341
+ - cockpit/themes/diana/symbols/parallel_branch_normal.svg
342
+ - cockpit/themes/diana/symbols/scripts.svg
343
+ - cockpit/themes/diana/symbols/start.svg
344
+ - cockpit/themes/diana/symbols/stop.svg
345
+ - cockpit/themes/diana/symbols/terminate.svg
346
+ - cockpit/themes/diana/theme.js
283
347
  - cockpit/themes/extended/rngs/alternative.rng
284
348
  - cockpit/themes/extended/rngs/call.rng
285
349
  - cockpit/themes/extended/rngs/callmanipulate.rng
286
350
  - cockpit/themes/extended/rngs/choose.rng
351
+ - cockpit/themes/extended/rngs/closed_loop.rng
352
+ - cockpit/themes/extended/rngs/closed_loop_cancel.rng
353
+ - cockpit/themes/extended/rngs/closed_loop_control.rng
354
+ - cockpit/themes/extended/rngs/closed_loop_measuring.rng
287
355
  - cockpit/themes/extended/rngs/critical.rng
288
356
  - cockpit/themes/extended/rngs/escape.rng
289
357
  - cockpit/themes/extended/rngs/group.rng
@@ -302,6 +370,10 @@ files:
302
370
  - cockpit/themes/extended/symbols/choose.svg
303
371
  - cockpit/themes/extended/symbols/choose_exclusive.svg
304
372
  - cockpit/themes/extended/symbols/choose_inclusive.svg
373
+ - cockpit/themes/extended/symbols/closed_loop.svg
374
+ - cockpit/themes/extended/symbols/closed_loop_cancel.svg
375
+ - cockpit/themes/extended/symbols/closed_loop_control.svg
376
+ - cockpit/themes/extended/symbols/closed_loop_measuring.svg
305
377
  - cockpit/themes/extended/symbols/complex.svg
306
378
  - cockpit/themes/extended/symbols/critical.svg
307
379
  - cockpit/themes/extended/symbols/end.svg
@@ -342,6 +414,10 @@ files:
342
414
  - cockpit/themes/model/symbols/choose.svg
343
415
  - cockpit/themes/model/symbols/choose_exclusive.svg
344
416
  - cockpit/themes/model/symbols/choose_inclusive.svg
417
+ - cockpit/themes/model/symbols/closed_loop.svg
418
+ - cockpit/themes/model/symbols/closed_loop_cancel.svg
419
+ - cockpit/themes/model/symbols/closed_loop_control.svg
420
+ - cockpit/themes/model/symbols/closed_loop_measuring.svg
345
421
  - cockpit/themes/model/symbols/complex.svg
346
422
  - cockpit/themes/model/symbols/critical.svg
347
423
  - cockpit/themes/model/symbols/end.svg
@@ -364,6 +440,10 @@ files:
364
440
  - cockpit/themes/packed/rngs/call.rng
365
441
  - cockpit/themes/packed/rngs/callmanipulate.rng
366
442
  - cockpit/themes/packed/rngs/choose.rng
443
+ - cockpit/themes/packed/rngs/closed_loop.rng
444
+ - cockpit/themes/packed/rngs/closed_loop_cancel.rng
445
+ - cockpit/themes/packed/rngs/closed_loop_control.rng
446
+ - cockpit/themes/packed/rngs/closed_loop_measuring.rng
367
447
  - cockpit/themes/packed/rngs/critical.rng
368
448
  - cockpit/themes/packed/rngs/escape.rng
369
449
  - cockpit/themes/packed/rngs/group.rng
@@ -382,6 +462,10 @@ files:
382
462
  - cockpit/themes/packed/symbols/choose.svg
383
463
  - cockpit/themes/packed/symbols/choose_exclusive.svg
384
464
  - cockpit/themes/packed/symbols/choose_inclusive.svg
465
+ - cockpit/themes/packed/symbols/closed_loop.svg
466
+ - cockpit/themes/packed/symbols/closed_loop_cancel.svg
467
+ - cockpit/themes/packed/symbols/closed_loop_control.svg
468
+ - cockpit/themes/packed/symbols/closed_loop_measuring.svg
385
469
  - cockpit/themes/packed/symbols/complex.svg
386
470
  - cockpit/themes/packed/symbols/critical.svg
387
471
  - cockpit/themes/packed/symbols/end.svg
@@ -404,6 +488,10 @@ files:
404
488
  - cockpit/themes/preset/rngs/call.rng
405
489
  - cockpit/themes/preset/rngs/callmanipulate.rng
406
490
  - cockpit/themes/preset/rngs/choose.rng
491
+ - cockpit/themes/preset/rngs/closed_loop.rng
492
+ - cockpit/themes/preset/rngs/closed_loop_cancel.rng
493
+ - cockpit/themes/preset/rngs/closed_loop_control.rng
494
+ - cockpit/themes/preset/rngs/closed_loop_measuring.rng
407
495
  - cockpit/themes/preset/rngs/critical.rng
408
496
  - cockpit/themes/preset/rngs/escape.rng
409
497
  - cockpit/themes/preset/rngs/group.rng
@@ -422,6 +510,10 @@ files:
422
510
  - cockpit/themes/preset/symbols/choose.svg
423
511
  - cockpit/themes/preset/symbols/choose_exclusive.svg
424
512
  - cockpit/themes/preset/symbols/choose_inclusive.svg
513
+ - cockpit/themes/preset/symbols/closed_loop.svg
514
+ - cockpit/themes/preset/symbols/closed_loop_cancel.svg
515
+ - cockpit/themes/preset/symbols/closed_loop_control.svg
516
+ - cockpit/themes/preset/symbols/closed_loop_measuring.svg
425
517
  - cockpit/themes/preset/symbols/complex.svg
426
518
  - cockpit/themes/preset/symbols/critical.svg
427
519
  - cockpit/themes/preset/symbols/end.svg
@@ -508,21 +600,16 @@ files:
508
600
  - server/resources/topics.xml
509
601
  - server/resources/transformation.xml
510
602
  - server/resources/transformation_dslx.xsl
511
- - server/routing/end.pid
512
603
  - server/routing/end.rb
513
- - server/routing/forward-events.pid
514
604
  - server/routing/forward-events.rb
515
- - server/routing/forward-votes.pid
516
605
  - server/routing/forward-votes.rb
517
- - server/routing/persist.pid
518
606
  - server/routing/persist.rb
519
607
  - server/server.conf
520
- - server/server.pid
521
608
  - server/server.rb
522
609
  - tools/cpee
610
+ - tools/server/cpee
523
611
  - tools/server/resources/notifications/logging/subscription.xml
524
612
  - tools/server/resources/properties.init
525
- - tools/server/server.rb
526
613
  homepage: http://cpee.org/
527
614
  licenses:
528
615
  - LGPL-3.0