diff --git a/src/main/jastadd/Coordinator.flex b/src/main/jastadd/Coordinator.flex index 7df1cb3162cc465a485384c20126c04edd1a19d7..cd60a203473a77aa0a16e4477f04e3c6a7a16838 100644 --- a/src/main/jastadd/Coordinator.flex +++ b/src/main/jastadd/Coordinator.flex @@ -53,6 +53,7 @@ Comment = "//" [^\n\r]+ "after" { return sym(Terminals.AFTER); } "sec" { return sym(Terminals.SEC); } "in" { return sym(Terminals.IN); } +"if" { return sym(Terminals.IF); } "start" { return sym(Terminals.START); } "using" { return sym(Terminals.USING); } "reqs" { return sym(Terminals.REQS); } diff --git a/src/main/jastadd/Coordinator.jrag b/src/main/jastadd/Coordinator.jrag index 064b2c96d372e1372c3b74890e94cab4e0002681..2ce1a9718918a0d4443bb9f6ffe1a5acee39c11b 100644 --- a/src/main/jastadd/Coordinator.jrag +++ b/src/main/jastadd/Coordinator.jrag @@ -134,6 +134,18 @@ aspect Navigation { syn boolean Component.isUnknownComponent() = false; eq UnknownComponent.isUnknownComponent() = true; + + syn boolean AutoSetStatus.isDelayAutoSetStatus() = false; + eq DelayAutoSetStatus.isDelayAutoSetStatus() = true; + + syn boolean AutoSetStatus.isMqttAutoSetStatus() = false; + eq MqttAutoSetStatus.isMqttAutoSetStatus() = true; + + syn DelayAutoSetStatus AutoSetStatus.asDelayAutoSetStatus() = null; + eq DelayAutoSetStatus.asDelayAutoSetStatus() = this; + + syn MqttAutoSetStatus AutoSetStatus.asMqttAutoSetStatus() = null; + eq MqttAutoSetStatus.asMqttAutoSetStatus() = this; } aspect Printing { @@ -197,9 +209,13 @@ aspect Printing { (getStartAsUp() ? ", StartAsUp = true" : "") + ">"; } - syn String AutoSetStatus.details() { + syn String AutoSetStatus.details(); + eq DelayAutoSetStatus.details() { return "[" + getStatus() + " after " + getDelayInSeconds() + " sec]"; } + syn String MqttAutoSetStatus.details() { + return "[" + getStatus() + " if sth. on " + getTopic() + " ]"; + } syn String StartStrategy.details(); eq DockerComposeStartStrategy.details() = "docker compose (name: " + getName() + ")"; eq ScriptStartStrategy.details() = "script (cmd: '" + getCommand() + "'" + (getCwd().isBlank() ? "" : "cwd: '" + getCwd() + "'") + ")"; diff --git a/src/main/jastadd/Coordinator.parser b/src/main/jastadd/Coordinator.parser index 1b5e9d8f5dd5fe9e489d4e9882e29c46aad4be7f..674f48c9ecfd249b02ed978de2464a1d8c6384d7 100644 --- a/src/main/jastadd/Coordinator.parser +++ b/src/main/jastadd/Coordinator.parser @@ -48,8 +48,9 @@ Component component = Component component_body = COMMA START USING start_strategy.s component_body.c {: c.setStartStrategy(s); return c; :} | COMMA REPORT USING report_strategy.r component_body.c {: c.setReportStrategy(r); return c; :} - | COMMA STATUS TEXT.s AFTER INTEGER.i SEC component_body.c {: c.setAutoSetStatus(new AutoSetStatus(s, Integer.parseInt(i))); return c; :} + | COMMA STATUS TEXT.s AFTER INTEGER.i SEC component_body.c {: c.setAutoSetStatus(new DelayAutoSetStatus(s, Integer.parseInt(i))); return c; :} | COMMA START AFTER REQS component_body.c {: c.setStartAsUp(true); return c; :} + | COMMA STATUS TEXT.s IF MQTT TEXT.topic component_body.c {: c.setAutoSetStatus(new MqttAutoSetStatus(s, topic)); return c; :} | {: Component c = new Component(); c.setStartStrategy(new ManualStartStrategy()); return c; :} ; diff --git a/src/main/jastadd/Coordinator.relast b/src/main/jastadd/Coordinator.relast index 3eb491c327cfa7f3268e7a88d33a4326724126fb..fc6a2537f49bfd562a6e4ac1be62318f2fc04597 100644 --- a/src/main/jastadd/Coordinator.relast +++ b/src/main/jastadd/Coordinator.relast @@ -10,7 +10,9 @@ ManualStartStrategy : StartStrategy ; abstract ReportStrategy ; MqttReportStrategy : ReportStrategy ::= <TopicPrefix:String> ; -AutoSetStatus ::= <Status:String> <DelayInSeconds:int> ; +abstract AutoSetStatus ::= <Status:String> ; +DelayAutoSetStatus : AutoSetStatus ::= <DelayInSeconds:int> ; +MqttAutoSetStatus : AutoSetStatus ::= <Topic:String> ; ParsedPrecedenceRelation ; rel ParsedPrecedenceRelation.Predecessor* -> Component ; diff --git a/src/main/java/de/tudresden/inf/st/coordinator/MainCoordinator.java b/src/main/java/de/tudresden/inf/st/coordinator/MainCoordinator.java index 8b277caaab0190feac1e19092cf30f131b678001..76aaf4417de47eb0428e16724d8ad4116637d58a 100644 --- a/src/main/java/de/tudresden/inf/st/coordinator/MainCoordinator.java +++ b/src/main/java/de/tudresden/inf/st/coordinator/MainCoordinator.java @@ -142,10 +142,16 @@ public class MainCoordinator implements Callable<Integer> { } private void scheduleAutoSetStatus(Component comp) { - executor.schedule(() -> { - System.out.println("Setting status of " + comp.getName() + " to " + comp.getAutoSetStatus().getStatus()); - comp.setStatus(comp.getAutoSetStatus().getStatus()); - }, comp.getAutoSetStatus().getDelayInSeconds(), TimeUnit.SECONDS); + if (comp.getAutoSetStatus().isDelayAutoSetStatus()) { + executor.schedule(() -> { + System.out.println("Setting status of " + comp.getName() + " to " + comp.getAutoSetStatus().getStatus()); + comp.setStatus(comp.getAutoSetStatus().getStatus()); + }, comp.getAutoSetStatus().asDelayAutoSetStatus().getDelayInSeconds(), TimeUnit.SECONDS); + } else if (comp.getAutoSetStatus().isMqttAutoSetStatus()) { + mainHandler.newConnection(comp.getAutoSetStatus().asMqttAutoSetStatus().getTopic(), bytes -> { + comp.setStatus(comp.getAutoSetStatus().getStatus()); + }); + } } private void printStatus(String message) {