Skip to content

Commit 3b2901d

Browse files
committed
feat: adding online runtime behavior
1 parent 8528ec4 commit 3b2901d

File tree

27 files changed

+311
-219
lines changed

27 files changed

+311
-219
lines changed

.idea/codeStyles/Project.xml

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/runConfigurations/cirrina__run_.xml

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

compose.yaml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
version: '3.7'
2+
configs:
3+
telegraf_config:
4+
file: ./telegraf.conf
5+
services:
6+
influxdb:
7+
image: "influxdb:2"
8+
ports:
9+
- "8086:8086"
10+
environment:
11+
- DOCKER_INFLUXDB_INIT_MODE=setup
12+
- DOCKER_INFLUXDB_INIT_USERNAME=admin
13+
- DOCKER_INFLUXDB_INIT_PASSWORD=adminadmin
14+
- DOCKER_INFLUXDB_INIT_ORG=org
15+
- DOCKER_INFLUXDB_INIT_BUCKET=bucket
16+
- DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=bzO10KmR8x
17+
telegraf:
18+
image: "telegraf:latest"
19+
ports:
20+
- "4317:4317"
21+
configs:
22+
- source: telegraf_config
23+
target: /etc/telegraf/telegraf.conf
24+
nats:
25+
image: "nats:latest"
26+
command:
27+
- "-js"
28+
ports:
29+
- "4222:4222"
30+
- "6222:6222"

src/main/java/at/ac/uibk/dps/cirrina/cirrina/CirrinaRuntime.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,10 @@ public void run() {
4444

4545
logger.info("Starting runtime: {}", name);
4646

47-
// Run, will return when finished
48-
//runtime.run();
47+
runtime.startFromPath(
48+
EnvironmentVariables.INSTANCE.getCsmPath().get(),
49+
EnvironmentVariables.INSTANCE.getInstantiate().get()
50+
);
4951

5052
logger.info("Done running");
5153
}
Lines changed: 52 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,74 @@
11
package at.ac.uibk.dps.cirrina.cirrina
22

33
enum class EventProvider {
4-
NATS
4+
NATS
55
}
66

77
enum class PersistentContextProvider {
8-
NATS
8+
NATS
99
}
1010

11-
data class EnvironmentVariable<T>(val name: String, val required: Boolean = false, val default: T? = null, val mapper: (String) -> T = {
11+
data class EnvironmentVariable<T>(
12+
val name: String, val required: Boolean = false, val default: T? = null, val mapper: (String) -> T = {
1213
it as T
13-
}) {
14-
fun get(): T? {
15-
val value = System.getenv(name)
16-
return when {
17-
value != null -> mapper(value)
18-
default != null -> default
19-
required -> throw IllegalStateException("Missing required environment variable: $name")
20-
else -> null
21-
}
14+
}
15+
) {
16+
fun get(): T? {
17+
val value = System.getenv(name)
18+
return when {
19+
value != null -> mapper(value)
20+
default != null -> default
21+
required -> throw IllegalStateException("Missing required environment variable: $name")
22+
else -> null
2223
}
24+
}
2325
}
2426

2527
object EnvironmentVariables {
26-
// NATS event handler-specific environment variables
27-
val natsEventUrl = EnvironmentVariable<String>("NATS_EVENT_URL", default = "nats://localhost:4222/")
28+
// NATS event handler-specific environment variables
29+
val natsEventUrl = EnvironmentVariable<String>("NATS_EVENT_URL", default = "nats://localhost:4222/")
2830

29-
// NATS persistent context-specific environment variables
30-
val natsPersistentContextUrl = EnvironmentVariable<String>("NATS_PERSISTENT_CONTEXT_URL", default = "nats://localhost:4222")
31-
val natsPersistentContextBucket = EnvironmentVariable<String>("NATS_PERSISTENT_CONTEXT_BUCKET", default = "persistent")
31+
// NATS persistent context-specific environment variables
32+
val natsPersistentContextUrl = EnvironmentVariable<String>("NATS_PERSISTENT_CONTEXT_URL", default = "nats://localhost:4222")
33+
val natsPersistentContextBucket = EnvironmentVariable<String>("NATS_PERSISTENT_CONTEXT_BUCKET", default = "persistent")
3234

33-
// General environment variables
34-
val eventProvider = EnvironmentVariable<EventProvider>(name = "EVENT_PROVIDER", required = true, mapper = { value ->
35+
// General environment variables
36+
val csmPath = EnvironmentVariable<String>("CSM_PATH", required = true)
37+
val instantiate =
38+
EnvironmentVariable(
39+
name = "INSTANTIATE",
40+
default = emptyList(),
41+
mapper = { value -> value.split(",").map { it.trim() }.filter { it.isNotEmpty() } },
42+
)
43+
val eventProvider =
44+
EnvironmentVariable(
45+
name = "EVENT_PROVIDER",
46+
default = EventProvider.NATS,
47+
mapper = { value ->
3548
try {
36-
EventProvider.valueOf(value.uppercase())
37-
} catch (e: IllegalArgumentException) {
38-
throw IllegalStateException("Invalid EVENT_PROVIDER: '$value'. Allowed: ${EventProvider.entries}")
49+
EventProvider.valueOf(value.uppercase())
50+
} catch (_: IllegalArgumentException) {
51+
throw IllegalStateException(
52+
"Invalid EVENT_PROVIDER: '$value'. Allowed: ${EventProvider.entries}"
53+
)
3954
}
40-
})
41-
val persistentContextProvider = EnvironmentVariable<PersistentContextProvider>(name = "PERSISTENT_CONTEXT_PROVIDER", required = true, mapper = { value ->
55+
},
56+
)
57+
val persistentContextProvider =
58+
EnvironmentVariable(
59+
name = "PERSISTENT_CONTEXT_PROVIDER",
60+
default = PersistentContextProvider.NATS,
61+
mapper = { value ->
4262
try {
43-
PersistentContextProvider.valueOf(value.uppercase())
44-
} catch (e: IllegalArgumentException) {
45-
throw IllegalStateException("Invalid PERSISTENT_CONTEXT_PROVIDER: '$value'. Allowed: ${PersistentContextProvider.entries}")
63+
PersistentContextProvider.valueOf(value.uppercase())
64+
} catch (_: IllegalArgumentException) {
65+
throw IllegalStateException(
66+
"Invalid PERSISTENT_CONTEXT_PROVIDER: '$value'. Allowed: ${PersistentContextProvider.entries}"
67+
)
4668
}
47-
})
48-
val healthPort = EnvironmentVariable<Int>("HEALTH_PORT", default = 0xCAFE) {
49-
it.toInt()
50-
}
69+
},
70+
)
71+
val healthPort = EnvironmentVariable("HEALTH_PORT", default = 0xCAFE) { it.toInt() }
5172
}
5273

5374

src/main/java/at/ac/uibk/dps/cirrina/classes/statemachine/StateMachineClass.java

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
import at.ac.uibk.dps.cirrina.classes.transition.OnTransitionClass;
55
import at.ac.uibk.dps.cirrina.classes.transition.TransitionClass;
66
import at.ac.uibk.dps.cirrina.csml.description.Csml.ContextDescription;
7-
import at.ac.uibk.dps.cirrina.execution.object.action.InvokeAction;
8-
import at.ac.uibk.dps.cirrina.execution.object.action.RaiseAction;
7+
import at.ac.uibk.dps.cirrina.execution.object.action.EventRaisingAction;
98
import at.ac.uibk.dps.cirrina.execution.object.event.Event;
109
import at.ac.uibk.dps.cirrina.io.plantuml.Exportable;
1110
import at.ac.uibk.dps.cirrina.io.plantuml.PlantUmlVisitor;
@@ -192,31 +191,21 @@ public List<String> getInputEvents() {
192191
}
193192

194193
/**
195-
* Returns the events that may be raised from this state.
194+
* Returns the events that may be raised from this state machine.
196195
*
197196
* @return Output events.
198197
*/
199198
public List<Event> getOutputEvents() {
200199
return Stream.concat(
201-
// Raise action events
202-
Stream.concat(
203-
vertexSet()
204-
.stream()
205-
.flatMap(v -> v.getActionsOfType(RaiseAction.class).stream()),
206-
edgeSet()
207-
.stream()
208-
.flatMap(e -> e.getActionsOfType(RaiseAction.class).stream())
209-
).map(RaiseAction::getEvent),
210-
// Invoke action events
211-
Stream.concat(
212-
vertexSet()
213-
.stream()
214-
.flatMap(v -> v.getActionsOfType(InvokeAction.class).stream()),
215-
edgeSet()
216-
.stream()
217-
.flatMap(e -> e.getActionsOfType(InvokeAction.class).stream())
218-
).flatMap(invokeAction -> invokeAction.getDone().stream())
219-
).toList();
200+
vertexSet()
201+
.stream()
202+
.flatMap(v -> v.getActionsOfType(EventRaisingAction.class).stream()),
203+
edgeSet()
204+
.stream()
205+
.flatMap(e -> e.getActionsOfType(EventRaisingAction.class).stream())
206+
)
207+
.flatMap(action -> action.raises().stream())
208+
.toList();
220209
}
221210

222211
/**

src/main/java/at/ac/uibk/dps/cirrina/execution/command/ActionTimeoutResetCommand.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ public final class ActionTimeoutResetCommand extends ActionCommand {
1717

1818
@Override
1919
public List<ActionCommand> execute() throws UnsupportedOperationException {
20-
return List.of(this);
20+
// Handled in StateMachine
21+
return List.of();
2122
}
2223

2324
public TimeoutResetAction getTimeoutResetAction() {
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package at.ac.uibk.dps.cirrina.execution.`object`.action
2+
3+
import at.ac.uibk.dps.cirrina.execution.`object`.event.Event
4+
5+
interface EventRaisingAction {
6+
fun raises(): List<Event>
7+
}

src/main/java/at/ac/uibk/dps/cirrina/execution/object/action/InvokeAction.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44
import at.ac.uibk.dps.cirrina.execution.object.context.ContextVariable;
55
import at.ac.uibk.dps.cirrina.execution.object.event.Event;
66
import java.util.List;
7+
import org.jetbrains.annotations.NotNull;
78

89
/**
910
* Invoke action, invokes a service type.
1011
*/
11-
public final class InvokeAction extends Action {
12+
public final class InvokeAction extends Action implements EventRaisingAction {
1213

1314
private final String serviceType;
1415

@@ -48,6 +49,12 @@ public List<ContextVariableReferenceDescription> getOutput() {
4849
return output;
4950
}
5051

52+
@Override
53+
@NotNull
54+
public List<Event> raises() {
55+
return done;
56+
}
57+
5158
public record Parameters(
5259
String serviceType,
5360
boolean isLocal,

src/main/java/at/ac/uibk/dps/cirrina/execution/object/action/MatchAction.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package at.ac.uibk.dps.cirrina.execution.object.action;
22

3+
import at.ac.uibk.dps.cirrina.execution.object.event.Event;
34
import at.ac.uibk.dps.cirrina.execution.object.expression.Expression;
5+
import java.util.List;
46
import java.util.Map;
7+
import org.jetbrains.annotations.NotNull;
58

6-
public final class MatchAction extends Action {
9+
public final class MatchAction extends Action implements EventRaisingAction {
710

811
private final Expression value;
912

@@ -22,5 +25,17 @@ public Map<Expression, Action> getCase() {
2225
return casee;
2326
}
2427

28+
@Override
29+
@NotNull
30+
public List<Event> raises() {
31+
return casee
32+
.values()
33+
.stream()
34+
.filter(a -> a instanceof EventRaisingAction)
35+
.map(a -> (EventRaisingAction) a)
36+
.flatMap(a -> a.raises().stream())
37+
.toList();
38+
}
39+
2540
public record Parameters(Expression value, Map<Expression, Action> casee) {}
2641
}

0 commit comments

Comments
 (0)