cpee 2.0.9 → 2.0.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/cockpit/config.json +3 -0
- data/cockpit/css/track.css +24 -6
- data/cockpit/css/ui.css +5 -2
- data/cockpit/css/wfadaptor.css +1 -1
- data/cockpit/edit.html +1 -0
- data/cockpit/index.html +3 -2
- data/cockpit/js/instance.js +82 -55
- data/cockpit/js/model.js +1 -1
- data/cockpit/js/track.js +10 -0
- data/cockpit/js/ui.js +47 -16
- data/cockpit/templates/Track Test Local.xml +82 -0
- data/cockpit/templates/Track Test.xml +82 -0
- data/cockpit/templates/{BPM 2020 Manual Adjust.xml → UR-VUE 2020 Manual Adjust.xml } +1 -1
- data/cockpit/templates/{BPM 2020 Solution Baseline.xml → UR-VUE 2020 Solution Baseline.xml } +10 -3
- data/cockpit/templates/{BPM 2020 Solution NN.xml → UR-VUE 2020 Solution NN.xml } +1 -1
- data/cockpit/templates/{BPM 2020 Solution View.xml → UR-VUE 2020 Solution View.xml } +8 -1
- data/cockpit/templates/UR-VUE 2020.xml +26 -0
- data/cockpit/templates/instantiate.local/Take_Sub.xml +59 -0
- data/cockpit/templates/instantiate/Take_Perf.xml +46 -0
- data/cockpit/templates/instantiate/Take_Sub.xml +58 -0
- data/cockpit/templates/instantiate/Take_X.xml +48 -0
- data/cockpit/themes/compact/rngs/call.rng +5 -0
- data/cockpit/themes/compact/rngs/callmanipulate.rng +6 -1
- data/cockpit/themes/compact/rngs/closed_loop.rng +59 -0
- data/cockpit/themes/compact/rngs/closed_loop_cancel.rng +5 -0
- data/cockpit/themes/compact/rngs/closed_loop_control.rng +28 -0
- data/cockpit/themes/compact/rngs/closed_loop_measuring.rng +9 -0
- data/cockpit/themes/compact/rngs/loop.rng +1 -1
- data/cockpit/themes/compact/rngs/parallel.rng +1 -1
- data/cockpit/themes/compact/symbols/closed_loop.svg +5 -0
- data/cockpit/themes/compact/symbols/closed_loop_cancel.svg +5 -0
- data/cockpit/themes/compact/symbols/closed_loop_control.svg +5 -0
- data/cockpit/themes/compact/symbols/closed_loop_measuring.svg +6 -0
- data/cockpit/themes/default/rngs/call.rng +5 -0
- data/cockpit/themes/default/rngs/callmanipulate.rng +6 -1
- data/cockpit/themes/default/rngs/closed_loop.rng +59 -0
- data/cockpit/themes/default/rngs/closed_loop_cancel.rng +5 -0
- data/cockpit/themes/default/rngs/closed_loop_control.rng +28 -0
- data/cockpit/themes/default/rngs/closed_loop_measuring.rng +9 -0
- data/cockpit/themes/default/rngs/loop.rng +1 -1
- data/cockpit/themes/default/rngs/parallel.rng +1 -1
- data/cockpit/themes/default/symbols/closed_loop.svg +5 -0
- data/cockpit/themes/default/symbols/closed_loop_cancel.svg +5 -0
- data/cockpit/themes/default/symbols/closed_loop_control.svg +5 -0
- data/cockpit/themes/default/symbols/closed_loop_measuring.svg +6 -0
- data/cockpit/themes/diana/rngs/alternative.rng +25 -0
- data/cockpit/themes/diana/rngs/call.rng +122 -0
- data/cockpit/themes/diana/rngs/callmanipulate.rng +145 -0
- data/cockpit/themes/diana/rngs/choose.rng +14 -0
- data/cockpit/themes/diana/rngs/closed_loop.rng +59 -0
- data/cockpit/themes/diana/rngs/closed_loop_cancel.rng +5 -0
- data/cockpit/themes/diana/rngs/closed_loop_control.rng +28 -0
- data/cockpit/themes/diana/rngs/closed_loop_measuring.rng +9 -0
- data/cockpit/themes/diana/rngs/critical.rng +5 -0
- data/cockpit/themes/diana/rngs/escape.rng +1 -0
- data/cockpit/themes/diana/rngs/group.rng +3 -0
- data/cockpit/themes/diana/rngs/loop.rng +22 -0
- data/cockpit/themes/diana/rngs/manipulate.rng +9 -0
- data/cockpit/themes/diana/rngs/otherwise.rng +22 -0
- data/cockpit/themes/diana/rngs/parallel.rng +21 -0
- data/cockpit/themes/diana/rngs/parallel_branch.rng +8 -0
- data/cockpit/themes/diana/rngs/scripts.rng +23 -0
- data/cockpit/themes/diana/rngs/stop.rng +5 -0
- data/cockpit/themes/diana/rngs/terminate.rng +1 -0
- data/cockpit/themes/diana/symbols/alternative.svg +5 -0
- data/cockpit/themes/diana/symbols/arrow.svg +3 -0
- data/cockpit/themes/diana/symbols/call.svg +6 -0
- data/cockpit/themes/diana/symbols/callmanipulate.svg +8 -0
- data/cockpit/themes/diana/symbols/choose.svg +5 -0
- data/cockpit/themes/diana/symbols/choose_exclusive.svg +5 -0
- data/cockpit/themes/diana/symbols/choose_inclusive.svg +4 -0
- data/cockpit/themes/diana/symbols/closed_loop.svg +5 -0
- data/cockpit/themes/diana/symbols/closed_loop_cancel.svg +5 -0
- data/cockpit/themes/diana/symbols/closed_loop_control.svg +5 -0
- data/cockpit/themes/diana/symbols/closed_loop_measuring.svg +6 -0
- data/cockpit/themes/diana/symbols/complex.svg +8 -0
- data/cockpit/themes/diana/symbols/critical.svg +4 -0
- data/cockpit/themes/diana/symbols/end.svg +3 -0
- data/cockpit/themes/diana/symbols/escape.svg +5 -0
- data/cockpit/themes/diana/symbols/event_end.svg +3 -0
- data/cockpit/themes/diana/symbols/loop.svg +5 -0
- data/cockpit/themes/diana/symbols/manipulate.svg +4 -0
- data/cockpit/themes/diana/symbols/otherwise.svg +5 -0
- data/cockpit/themes/diana/symbols/parallel.svg +5 -0
- data/cockpit/themes/diana/symbols/parallel_branch.svg +5 -0
- data/cockpit/themes/diana/symbols/parallel_branch_compact.svg +4 -0
- data/cockpit/themes/diana/symbols/parallel_branch_event.svg +14 -0
- data/cockpit/themes/diana/symbols/parallel_branch_normal.svg +5 -0
- data/cockpit/themes/diana/symbols/scripts.svg +4 -0
- data/cockpit/themes/diana/symbols/start.svg +3 -0
- data/cockpit/themes/diana/symbols/stop.svg +5 -0
- data/cockpit/themes/diana/symbols/terminate.svg +4 -0
- data/cockpit/themes/diana/theme.js +1650 -0
- data/cockpit/themes/extended/rngs/call.rng +5 -0
- data/cockpit/themes/extended/rngs/callmanipulate.rng +6 -1
- data/cockpit/themes/extended/rngs/closed_loop.rng +59 -0
- data/cockpit/themes/extended/rngs/closed_loop_cancel.rng +5 -0
- data/cockpit/themes/extended/rngs/closed_loop_control.rng +28 -0
- data/cockpit/themes/extended/rngs/closed_loop_measuring.rng +9 -0
- data/cockpit/themes/extended/rngs/loop.rng +1 -1
- data/cockpit/themes/extended/rngs/parallel.rng +1 -1
- data/cockpit/themes/extended/symbols/closed_loop.svg +5 -0
- data/cockpit/themes/extended/symbols/closed_loop_cancel.svg +5 -0
- data/cockpit/themes/extended/symbols/closed_loop_control.svg +5 -0
- data/cockpit/themes/extended/symbols/closed_loop_measuring.svg +6 -0
- data/cockpit/themes/extended/theme.js +4 -0
- data/cockpit/themes/model/symbols/closed_loop.svg +5 -0
- data/cockpit/themes/model/symbols/closed_loop_cancel.svg +5 -0
- data/cockpit/themes/model/symbols/closed_loop_control.svg +5 -0
- data/cockpit/themes/model/symbols/closed_loop_measuring.svg +6 -0
- data/cockpit/themes/packed/rngs/call.rng +5 -0
- data/cockpit/themes/packed/rngs/callmanipulate.rng +6 -1
- data/cockpit/themes/packed/rngs/closed_loop.rng +59 -0
- data/cockpit/themes/packed/rngs/closed_loop_cancel.rng +5 -0
- data/cockpit/themes/packed/rngs/closed_loop_control.rng +28 -0
- data/cockpit/themes/packed/rngs/closed_loop_measuring.rng +9 -0
- data/cockpit/themes/packed/rngs/loop.rng +1 -1
- data/cockpit/themes/packed/rngs/parallel.rng +1 -1
- data/cockpit/themes/packed/symbols/closed_loop.svg +5 -0
- data/cockpit/themes/packed/symbols/closed_loop_cancel.svg +5 -0
- data/cockpit/themes/packed/symbols/closed_loop_control.svg +5 -0
- data/cockpit/themes/packed/symbols/closed_loop_measuring.svg +6 -0
- data/cockpit/themes/preset/rngs/call.rng +5 -0
- data/cockpit/themes/preset/rngs/callmanipulate.rng +6 -1
- data/cockpit/themes/preset/rngs/closed_loop.rng +59 -0
- data/cockpit/themes/preset/rngs/closed_loop_cancel.rng +5 -0
- data/cockpit/themes/preset/rngs/closed_loop_control.rng +28 -0
- data/cockpit/themes/preset/rngs/closed_loop_measuring.rng +9 -0
- data/cockpit/themes/preset/rngs/loop.rng +1 -1
- data/cockpit/themes/preset/rngs/parallel.rng +1 -1
- data/cockpit/themes/preset/symbols/closed_loop.svg +5 -0
- data/cockpit/themes/preset/symbols/closed_loop_cancel.svg +5 -0
- data/cockpit/themes/preset/symbols/closed_loop_control.svg +5 -0
- data/cockpit/themes/preset/symbols/closed_loop_measuring.svg +6 -0
- data/cockpit/track.html +37 -8
- data/cpee.gemspec +2 -2
- data/lib/cpee/controller.rb +3 -2
- data/lib/cpee/implementation.rb +14 -5
- data/lib/cpee/implementation_notifications.rb +80 -51
- data/lib/cpee/implementation_properties.rb +5 -2
- data/lib/cpee/persistence.rb +3 -0
- data/server/handlerwrappers/default.rb +4 -5
- data/server/routing/forward-events.rb +2 -1
- data/server/routing/forward-votes.rb +6 -2
- data/server/server.conf +4 -0
- data/tools/cpee +7 -8
- data/tools/server/server.rb +1 -0
- metadata +110 -11
- data/cockpit/templates/BPM 2020.xml +0 -26
- data/cockpit/templates/convert_cpee2.rb +0 -15
- data/cockpit/themes/convert_cpee2.rb +0 -8
@@ -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,28 @@
|
|
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
|
+
<element name="_expected" rngui:header="Values Expected to Change">
|
3
|
+
<zeroOrMore rngui:label="Add Value">
|
4
|
+
<element name="change">
|
5
|
+
<element name="type" rngui:label="Control type">
|
6
|
+
<choice>
|
7
|
+
<value>:PID</value>
|
8
|
+
<value>:PI</value>
|
9
|
+
<value>:PD</value>
|
10
|
+
<value>:P</value>
|
11
|
+
<value>:I</value>
|
12
|
+
<value>:PT1</value>
|
13
|
+
<value>:PT2</value>
|
14
|
+
</choice>
|
15
|
+
</element>
|
16
|
+
<element name="value" rngui:label="Value">
|
17
|
+
<data type="string" rngui:label="a dataelement"/>
|
18
|
+
</element>
|
19
|
+
<element name="upper" rngui:label="Upper Limit">
|
20
|
+
<data type="float" rngui:label="Max value after next measure"/>
|
21
|
+
</element>
|
22
|
+
<element name="lower" rngui:label="Lower Limit">
|
23
|
+
<data type="float" rngui:label="Min value after next measure"/>
|
24
|
+
</element>
|
25
|
+
</element>
|
26
|
+
</zeroOrMore>
|
27
|
+
</element>
|
28
|
+
</element>
|
@@ -0,0 +1,9 @@
|
|
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
|
+
<element name="_expected" rngui:header="Values Expected to Change">
|
3
|
+
<zeroOrMore rngui:label="Add Value">
|
4
|
+
<element name="value" rngui:label="Value">
|
5
|
+
<data type="string" rngui:label="a dataelement"/>
|
6
|
+
</element>
|
7
|
+
</zeroOrMore>
|
8
|
+
</element>
|
9
|
+
</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>
|
data/cockpit/track.html
CHANGED
@@ -62,12 +62,41 @@
|
|
62
62
|
<div class='hidden' id='relaxngworker'></div>
|
63
63
|
<div id="trackfull">
|
64
64
|
<div id='graphcolumn'>
|
65
|
-
<div id="
|
66
|
-
<
|
67
|
-
<span
|
65
|
+
<div id="trackusage">
|
66
|
+
<div id='tracktitle'>
|
67
|
+
<span>
|
68
|
+
<a class="x-ui-button" name="glob_reload" title='reload' href=''>
|
69
|
+
<svg viewBox="0 -1.5 7 12" width="10" height="16">
|
70
|
+
<path
|
71
|
+
style="fill:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stop-color:#000000"
|
72
|
+
d="M 3.5,1.5 C 1.431441,1.5001975 -0.24540803,3.1770466 -0.24560554,5.2456055 -0.2454082,7.3141647 1.4314408,8.991014 3.5,8.9912113 5.5685591,8.991014 7.2454081,7.3141647 7.2456054,5.2456055 7.2454079,3.1770466 5.5685589,1.5001975 3.5,1.5 Z M 3.437195,4.0616198 c 0.020931,-5.551e-4 0.041873,-5.551e-4 0.062805,0 0.6537674,3.133e-4 1.1836723,0.5302183 1.1839856,1.1839857 C 4.6836723,5.8993729 4.1537674,6.4292778 3.5,6.4295912 2.8462325,6.4292778 2.3163276,5.8993729 2.3160142,5.2456055 2.315414,4.6155841 2.8080758,4.0953252 3.437195,4.0616198 Z"/>
|
73
|
+
</svg>
|
74
|
+
</a>
|
75
|
+
<a class="x-ui-button" name="glob_edit" title='edit' target='_blank' href='' id='current-monitor'><svg viewBox="0 -1.5 7 12" width="10" height="16">
|
76
|
+
<path
|
77
|
+
style="fill:#000000;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
78
|
+
d="M -0.25,7.8194404 0.57057194,10.599984 3.1882886,9.3540573 Z"/>
|
79
|
+
<path
|
80
|
+
style="fill:#000000;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
81
|
+
d="M 3.5215262,8.6074434 6.0527848,2.9361926 2.6144961,1.4015756 0.08323736,7.0728263 Z"/>
|
82
|
+
<path
|
83
|
+
style="fill:#000000;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
84
|
+
d="M 6.4439758,2.0597335 6.9719316,0.87685566 3.533643,-0.6577613 3.005687,0.52511656 Z"/>
|
85
|
+
</svg></a>
|
86
|
+
<a class="x-ui-button" name="glob_unshow" title='unshow'>
|
87
|
+
<svg viewBox="0 -1.5 7 12" width="10" height="16">
|
88
|
+
<path
|
89
|
+
style="fill:#000000;stroke-width:0;stop-color:#000000"
|
90
|
+
d="M 5.75,1.4999999 3.5,3.75 1.25,1.4999999 -0.25000013,3 2,5.25 -0.25000013,7.5 1.25,9.0000002 3.5,6.75 5.75,9.0000002 7.2500001,7.5 5,5.25 7.2500001,3 Z"/>
|
91
|
+
</svg>
|
92
|
+
</a>
|
93
|
+
</span>
|
94
|
+
<span> - </span>
|
95
|
+
<span id="title">Loading ...</span><span> <a style='display:none' target='_blank' id='current-log'>L</a></span>
|
96
|
+
</div>
|
97
|
+
<div id='state'>
|
68
98
|
<span id="state_any">
|
69
|
-
<
|
70
|
-
<button name="state_start" title='start'>
|
99
|
+
<button name="state_start" title='start' style='display:none'>
|
71
100
|
<svg viewBox="0 -1.5 7 12" width="10" height="16">
|
72
101
|
<path
|
73
102
|
style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
@@ -82,7 +111,6 @@
|
|
82
111
|
</svg>
|
83
112
|
</button>
|
84
113
|
<span id="state_extended">
|
85
|
-
<span> / </span>
|
86
114
|
<button name="state_replay" title='replay'>
|
87
115
|
<svg viewBox="0 -1.5 7 12" width="10" height="16">
|
88
116
|
<path
|
@@ -90,7 +118,6 @@
|
|
90
118
|
d="m -0.24999978,8.9999993 c 0,-2.7488167 0,-5.4976332 0,-8.24644997 C 1.1183278,0.76955385 2.4884861,0.71666052 3.8555376,0.79065567 4.5083287,0.83810218 5.2238942,1.0790874 5.5755039,1.7307256 6.1661398,2.7080902 6.0299484,4.2180754 5.1108772,4.9019222 4.7622397,5.1617467 4.3480204,5.2956156 3.9336064,5.3605366 4.9287868,5.9394132 5.4254071,7.0996814 6.0167729,8.0858876 6.1549588,8.3769029 6.4657247,8.7723933 6.5,8.9999999 c -0.5944185,0 -1.1888371,0 -1.7832559,0 C 4.0758679,7.9893475 3.4946311,6.9294648 2.7923497,5.9678488 2.4230355,5.5319748 1.8508715,5.5458842 1.3513114,5.5576027 c -0.1507526,-0.00412 -0.044576,0.272902 -0.076255,0.3990664 0,1.0144436 0,2.028887 0,3.0433307 -0.50835205,-3e-7 -1.01670555,8e-7 -1.52505618,-5e-7 z M 1.2750578,4.2411336 C 2.111059,4.2189781 2.9581852,4.3060525 3.7849326,4.1387394 4.4863715,3.8915585 4.5732952,2.6432813 3.9026802,2.2941453 3.5098807,2.068434 3.050719,2.1857044 2.6267379,2.1489138 c -0.4505578,-0.00242 -0.90112,0.00147 -1.3516801,-3.456e-4 0,0.6975176 0,1.3950347 0,2.0925522 z"
|
91
119
|
</svg>
|
92
120
|
</button>
|
93
|
-
<span> / </span>
|
94
121
|
<button name="state_abandon" title='abandon'>
|
95
122
|
<svg viewBox="0 -1.5 7 12" width="10" height="16">
|
96
123
|
<path
|
@@ -99,8 +126,10 @@
|
|
99
126
|
</svg>
|
100
127
|
</button>
|
101
128
|
</span>
|
129
|
+
<span> - Status: </span>
|
102
130
|
</span>
|
103
|
-
|
131
|
+
<span id="state_text">loading ...</span>
|
132
|
+
</div>
|
104
133
|
</div>
|
105
134
|
<div id='graphgrid'>
|
106
135
|
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:x="http://www.w3.org/1999/xlink" id='graphcanvas' width='1' height='1'></svg>
|
data/cpee.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "cpee"
|
3
|
-
s.version = "2.0.
|
3
|
+
s.version = "2.0.16"
|
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."
|
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.email = 'juergen.mangler@gmail.com'
|
22
22
|
s.homepage = 'http://cpee.org/'
|
23
23
|
|
24
|
-
s.add_runtime_dependency 'riddl', '~> 0.
|
24
|
+
s.add_runtime_dependency 'riddl', '~> 0.108'
|
25
25
|
s.add_runtime_dependency 'weel', '~> 1.99', '>= 1.99.90'
|
26
26
|
s.add_runtime_dependency 'highline', '~> 2.0'
|
27
27
|
s.add_runtime_dependency 'json', '~>2.1'
|
data/lib/cpee/controller.rb
CHANGED
@@ -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
|
data/lib/cpee/implementation.rb
CHANGED
@@ -72,7 +72,9 @@ module CPEE
|
|
72
72
|
opts[:infinite_loop_stop] ||= 10000
|
73
73
|
opts[:redis_path] ||= '/tmp/redis.sock'
|
74
74
|
opts[:redis_db] ||= 3
|
75
|
+
opts[:sse_keepalive_frequency] ||= 10
|
75
76
|
|
77
|
+
opts[:sse_connections] = {}
|
76
78
|
opts[:redis] = Redis.new(path: opts[:redis_path], db: opts[:redis_db])
|
77
79
|
opts[:statemachine] = CPEE::StateMachine.new opts[:states], %w{running simulating replaying finishing stopping abandoned finished} do |id|
|
78
80
|
opts[:redis].get("instance:#{id}/state")
|
@@ -88,13 +90,20 @@ module CPEE
|
|
88
90
|
|
89
91
|
Proc.new do
|
90
92
|
parallel do
|
91
|
-
CPEE::watch_services(
|
92
|
-
EM.add_periodic_timer(
|
93
|
-
CPEE::watch_services(
|
93
|
+
CPEE::watch_services(opts[:watchdog_start_off])
|
94
|
+
EM.add_periodic_timer(opts[:watchdog_frequency]) do ### start services
|
95
|
+
CPEE::watch_services(opts[:watchdog_start_off])
|
96
|
+
end
|
97
|
+
EM.defer do ### catch all sse connections
|
98
|
+
CPEE::Notifications::sse_distributor(opts)
|
99
|
+
end
|
100
|
+
EM.add_periodic_timer(opts[:sse_keepalive_frequency]) do
|
101
|
+
CPEE::Notifications::sse_heartbeat(opts)
|
94
102
|
end
|
95
103
|
end
|
104
|
+
|
96
105
|
cleanup do
|
97
|
-
CPEE::cleanup_services(
|
106
|
+
CPEE::cleanup_services(opts[:watchdog_start_off])
|
98
107
|
end
|
99
108
|
|
100
109
|
interface 'main' do
|
@@ -218,7 +227,7 @@ module CPEE
|
|
218
227
|
end
|
219
228
|
end rescue nil # all the ones that are not ok, are ignored
|
220
229
|
end
|
221
|
-
multi.set(File.join(instance, 'attributes', 'uuid'),
|
230
|
+
multi.set(File.join(instance, 'attributes', 'uuid'), uuid)
|
222
231
|
multi.zadd(File.join(instance, 'attributes'), -2, 'uuid')
|
223
232
|
multi.set(File.join(instance, 'attributes', 'info'), name)
|
224
233
|
multi.zadd(File.join(instance, 'attributes'), -1, 'info')
|
@@ -73,35 +73,40 @@ module CPEE
|
|
73
73
|
id = @a[0]
|
74
74
|
opts = @a[1]
|
75
75
|
key = @r[-1]
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
76
|
+
if CPEE::Persistence::exists_handler?(id,opts,key)
|
77
|
+
Riddl::Parameter::Complex.new("subscriptions","text/xml") do
|
78
|
+
ret = XML::Smart::string <<-END
|
79
|
+
<subscription xmlns='http://riddl.org/ns/common-patterns/notifications-producer/2.0'/>
|
80
|
+
END
|
81
|
+
url = CPEE::Persistence::extract_item(id,opts,File.join('handler',key,'url'))
|
82
|
+
ret.root.attributes['url'] = url if url && !url.empty?
|
83
|
+
items = {}
|
84
|
+
CPEE::Persistence::extract_handler(id,opts,key).each do |h|
|
85
|
+
t, i, v = h.split('/')
|
86
|
+
items[t] ||= []
|
87
|
+
items[t] << [i,v]
|
88
|
+
end
|
89
|
+
items.each do |k,v|
|
90
|
+
ret.root.add('topic').tap do |n|
|
91
|
+
n.attributes['id'] = k
|
92
|
+
v.each do |e|
|
93
|
+
n.add *e
|
94
|
+
end
|
93
95
|
end
|
94
96
|
end
|
97
|
+
ret.to_s
|
95
98
|
end
|
96
|
-
|
97
|
-
|
99
|
+
else
|
100
|
+
@status = 404
|
101
|
+
end
|
98
102
|
end
|
99
103
|
end #}}}
|
100
104
|
|
101
|
-
|
105
|
+
class CreateSubscription < Riddl::Implementation #{{{
|
102
106
|
def response
|
103
107
|
id = @a[0]
|
104
108
|
opts = @a[1]
|
109
|
+
|
105
110
|
key = Digest::MD5.hexdigest(Kernel::rand().to_s)
|
106
111
|
|
107
112
|
url = @p[0].name == 'url' ? @p.shift.value : nil
|
@@ -124,15 +129,19 @@ module CPEE
|
|
124
129
|
opts = @a[1]
|
125
130
|
key = @r.last
|
126
131
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
132
|
+
if CPEE::Persistence::exists_handler?(id,opts,key)
|
133
|
+
url = @p[0].name == 'url' ? @p.shift.value : nil
|
134
|
+
values = []
|
135
|
+
while @p.length > 0
|
136
|
+
topic = @p.shift.value
|
137
|
+
base = @p.shift
|
138
|
+
type = base.name
|
139
|
+
values += base.value.split(',').map { |i| File.join(topic,type[0..-2],i) }
|
140
|
+
end
|
141
|
+
@header = CPEE::Persistence::set_handler(id,opts,key,url,values,true)
|
142
|
+
else
|
143
|
+
@status = 404
|
134
144
|
end
|
135
|
-
@header = CPEE::Persistence::set_handler(id,opts,key,url,values,true)
|
136
145
|
end
|
137
146
|
end #}}}
|
138
147
|
|
@@ -146,41 +155,61 @@ module CPEE
|
|
146
155
|
opts = @a[1]
|
147
156
|
key = @r.last
|
148
157
|
|
149
|
-
|
158
|
+
if CPEE::Persistence::exists_handler?(id,opts,key)
|
159
|
+
DeleteSubscription::set(id,opts,key)
|
160
|
+
else
|
161
|
+
@status = 404
|
162
|
+
end
|
150
163
|
nil
|
151
164
|
end
|
152
165
|
end #}}}
|
153
166
|
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
+
def self::sse_distributor(opts) #{{{
|
168
|
+
conn = Redis.new(path: opts[:redis_path], db: opts[:redis_db])
|
169
|
+
conn.psubscribe('forward:*','event:state/change') do |on|
|
170
|
+
on.pmessage do |pat, what, message|
|
171
|
+
if pat == 'forward:*'
|
172
|
+
_, id, key = what.match(/forward(-end)?:([^\/]+)\/(.+)/).captures
|
173
|
+
opts.dig(:sse_connections,id.to_i,key)&.send message
|
174
|
+
elsif pat == 'event:state/change'
|
175
|
+
mess = JSON.parse(message[message.index(' ')+1..-1])
|
176
|
+
state = mess.dig('content','state')
|
177
|
+
if state == 'finished' || state == 'abandoned'
|
178
|
+
opts.dig(:sse_connections,mess.dig('instance').to_i)&.each do |key,sse|
|
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)
|
180
|
+
sse.close
|
181
|
+
end
|
167
182
|
end
|
168
183
|
end
|
169
184
|
end
|
170
|
-
@conn.close
|
171
185
|
end
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
186
|
+
end
|
187
|
+
conn.close
|
188
|
+
end #}}}
|
189
|
+
def self::sse_heartbeat(opts) #{{{
|
190
|
+
opts.dig(:sse_connections).each do |id,keys|
|
191
|
+
keys.each do |key,sse|
|
192
|
+
sse.send_with_id('heartbeat', '42') unless sse&.closed?
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end #}}}
|
196
|
+
class SSE < Riddl::SSEImplementation #{{{
|
197
|
+
def onopen
|
198
|
+
@opts = @a[1]
|
199
|
+
@id = @a[0]
|
200
|
+
@key = @r[-2]
|
201
|
+
if CPEE::Persistence::exists_handler?(@id,@opts,@key)
|
202
|
+
@opts[:sse_connections][@id] ||= {}
|
203
|
+
@opts[:sse_connections][@id][@key] = self
|
204
|
+
true
|
205
|
+
else
|
206
|
+
false
|
177
207
|
end
|
178
208
|
end
|
179
209
|
|
180
210
|
def onclose
|
181
|
-
|
182
|
-
|
183
|
-
tredis.close
|
211
|
+
@opts.dig(:sse_connections,@id)&.delete(@key)
|
212
|
+
@opts.dig(:sse_connections)&.delete(@id) if @opts.dig(:sse_connections,@id)&.length == 0
|
184
213
|
DeleteSubscription::set(@id,@opts,@key)
|
185
214
|
end
|
186
215
|
end #}}}
|
@@ -660,8 +660,11 @@ module CPEE
|
|
660
660
|
@status = 422 # semantic error
|
661
661
|
else
|
662
662
|
begin
|
663
|
-
|
664
|
-
|
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
|
data/lib/cpee/persistence.rb
CHANGED
@@ -125,6 +125,9 @@ module CPEE
|
|
125
125
|
def self::extract_handler(id,opts,key) #{{{
|
126
126
|
opts[:redis].smembers("instance:#{id}/handlers/#{key}")
|
127
127
|
end #}}}
|
128
|
+
def self::exists_handler?(id,opts,key) #{{{
|
129
|
+
opts[:redis].exists?("instance:#{id}/handlers/#{key}")
|
130
|
+
end #}}}
|
128
131
|
def self::extract_handlers(id,opts) #{{{
|
129
132
|
opts[:redis].smembers("instance:#{id}/handlers").map do |e|
|
130
133
|
[e, opts[:redis].get("instance:#{id}/handlers/#{e}/url")]
|