diff --git a/eraser-base/src/main/jastadd/ItemHistory.jrag b/eraser-base/src/main/jastadd/ItemHistory.jrag index 02f226f8d2a7c59ed7ad5d2d383609096af9d049..60d38ad92abbfa758397b0a6880c704ab2968de6 100644 --- a/eraser-base/src/main/jastadd/ItemHistory.jrag +++ b/eraser-base/src/main/jastadd/ItemHistory.jrag @@ -7,9 +7,14 @@ aspect ItemHistory { public static final InfluxRoot InfluxRoot.createDefault() { InfluxRoot result = new InfluxRoot(); - result.setUser(DEFAULT_USER); - result.setPassword(DEFAULT_PASSWORD); + + ExternalHost eh = new ExternalHost(); + eh.setUserName(DEFAULT_USER); + eh.setPassword(DEFAULT_PASSWORD); + result.setHost(eh); + result.setDbName(DEFAULT_DB_NAME); + return result; } diff --git a/eraser-base/src/main/jastadd/Printing.jrag b/eraser-base/src/main/jastadd/Printing.jrag index ba63b98b78dfeaaa99a4df1fbcdc117ac05ec7ff..a1f43ee2e435fa99bb008075023234baf5d2b6f3 100644 --- a/eraser-base/src/main/jastadd/Printing.jrag +++ b/eraser-base/src/main/jastadd/Printing.jrag @@ -182,30 +182,31 @@ aspect Printing { } // ExternalHost: "hostName:port" - syn String ExternalHost.prettyPrint(int defaultPort) { - if (getPort() == defaultPort) { - // default port, do not add + syn String ExternalHost.prettyPrint() { + if (getHostName().contains(":")) { return getHostName(); - } // otherwise specify port - return getHostName() + ":" + getPort(); + } + return getHostName() + (getPort()>0 ? ":" + getPort() : ""); } // Mqtt: incoming="" outgoing="" host=""; eq MqttRoot.prettyPrint() { + ExternalHost host = getHost(); return new MemberPrinter("Mqtt") .addNonDefault("incoming", getIncomingPrefix()) .addNonDefault("outgoing", getOutgoingPrefix()) - .addOptional("host", hasHost(), () -> getHost().prettyPrint(DEFAULT_PORT)) + .addOptional("host", hasHost() && !host.getHostName().isEmpty(), () -> host.prettyPrint()) .build(); } // Influx: user="" password="" dbName="" host="" ; eq InfluxRoot.prettyPrint() { + ExternalHost host = getHost(); return new MemberPrinter("Influx") - .addNonDefault("user", getUser(), DEFAULT_USER) - .addNonDefault("password", getPassword(), DEFAULT_PASSWORD) + .addNonDefault("user", host.getUserName(), DEFAULT_USER) + .addNonDefault("password", host.getPassword(), DEFAULT_PASSWORD) .addNonDefault("dbName", getDbName(), DEFAULT_DB_NAME) - .addOptional("host", hasHost(), () -> getHost().prettyPrint(DEFAULT_PORT)) + .addOptional("host", hasHost() && !host.getHostName().isEmpty(), () -> host.prettyPrint()) .build(); } diff --git a/eraser-base/src/main/jastadd/Util.jrag b/eraser-base/src/main/jastadd/Util.jrag index 201582e3b9facf3029ffe799a4f69c66c3671174..4973711b3538887294d15b91b9b09c3cd5247a8b 100644 --- a/eraser-base/src/main/jastadd/Util.jrag +++ b/eraser-base/src/main/jastadd/Util.jrag @@ -4,16 +4,47 @@ aspect Util { // public static ExternalHost ExternalHost.createByName(String hostName) { // return new ExternalHost(hostName, 1883); // } - public void MqttRoot.setHostByName(String hostName) { - setHost(ExternalHost.of(hostName, DEFAULT_PORT)); + public void MqttRoot.updateHost(String hostName, int port, String username, String password) { + if (getHost()==null) { + setHost(new ExternalHost()); + } + if (hostName!=null) { + getHost().setHostName(hostName); + } + if (port>0) { + getHost().setPort(port); + } + if (username!=null) { + getHost().setUserName(username); + } + if (password!=null) { + getHost().setPassword(password); + } flushCache(); } - public void InfluxRoot.setHostByName(String hostName) { - setHost(ExternalHost.of(hostName, DEFAULT_PORT)); + + public void InfluxRoot.updateHost(String hostName, String username, String password) { + if (getHost()==null) { + setHost(new ExternalHost()); + } + if (hostName!=null) { + getHost().setHostName(hostName); + } + if (username!=null) { + getHost().setUserName(username); + } + if (password!=null) { + getHost().setPassword(password); + } } public static ExternalHost ExternalHost.of(String hostName, int defaultPort) { + return ExternalHost.of(hostName,defaultPort,null,null); + } + + + public static ExternalHost ExternalHost.of(String hostName, int defaultPort, String username, String password) { String host = hostName; int port = defaultPort; if (hostName.contains(":")) { @@ -21,10 +52,18 @@ aspect Util { host = parts[0]; port = Integer.parseInt(parts[1]); } - return new ExternalHost(host, port); + ExternalHost eh = new ExternalHost(); + eh.setHostName(host); + eh.setPort(port); + if (username!=null) + eh.setUserName(username); + if (password!=null) + eh.setPassword(password); + + return eh; } - syn String ExternalHost.urlAsString() = String.format("http://%s:%s", getHostName(), getPort()); + syn String ExternalHost.urlAsString() = String.format("http://%s", getHostName()).concat(getPort()>0 ? ""+getPort() : ""); public static Root Root.createEmptyRoot() { Root model = new Root(); diff --git a/eraser-base/src/main/jastadd/eraser.parser b/eraser-base/src/main/jastadd/eraser.parser index 019e0c309eba8f991dc5749da407be5261a7a7ea..573db220b47f183800a8a0b434900fd58d0a2735 100644 --- a/eraser-base/src/main/jastadd/eraser.parser +++ b/eraser-base/src/main/jastadd/eraser.parser @@ -331,9 +331,9 @@ MqttRoot mqtt_root = MqttRoot mqtt_root_body = INCOMING EQUALS TEXT.n mqtt_root_body.mrb {: mrb.setIncomingPrefix(ensureTrailingSlash(n)); return mrb; :} | OUTGOING EQUALS TEXT.n mqtt_root_body.mrb {: mrb.setOutgoingPrefix(ensureTrailingSlash(n)); return mrb; :} - | HOST EQUALS TEXT.n mqtt_root_body.mrb {: mrb.setHostByName(n); return mrb; :} - | USER EQUALS TEXT.n mqtt_root_body.mrb {: mrb.setUser(n); return mrb; :} - | PASSWORD EQUALS TEXT.n mqtt_root_body.mrb {: mrb.setPassword(n); return mrb; :} + | HOST EQUALS TEXT.n mqtt_root_body.mrb {: mrb.updateHost(n,0,null,null); return mrb; :} + | USER EQUALS TEXT.n mqtt_root_body.mrb {: mrb.updateHost(null,0,n,null); return mrb; :} + | PASSWORD EQUALS TEXT.n mqtt_root_body.mrb {: mrb.updateHost(null,0,null,n); return mrb; :} | {: return new MqttRoot(); :} ; @@ -345,10 +345,10 @@ InfluxRoot influx_root = // Influx: user="" password="" dbName="" host="" ; InfluxRoot influx_root_body = - USER EQUALS TEXT.n influx_root_body.irb {: irb.setUser(n); return irb; :} - | PASSWORD EQUALS TEXT.n influx_root_body.irb {: irb.setPassword(n); return irb; :} + USER EQUALS TEXT.n influx_root_body.irb {: irb.updateHost(null,n,null); return irb; :} + | PASSWORD EQUALS TEXT.n influx_root_body.irb {: irb.updateHost(null,null,n); return irb; :} | DB_NAME EQUALS TEXT.n influx_root_body.irb {: irb.setDbName(n); return irb; :} - | HOST EQUALS TEXT.n influx_root_body.irb {: irb.setHostByName(n); return irb; :} + | HOST EQUALS TEXT.n influx_root_body.irb {: irb.updateHost(n,null,null); return irb; :} | {: return InfluxRoot.createDefault(); :} ; diff --git a/eraser-base/src/main/jastadd/main.relast b/eraser-base/src/main/jastadd/main.relast index e12d23dc7185d244d079e3aa5d712a4290c8a2f4..6573bd4d688f173dd7020147f7db6e0a6cfd4ef3 100644 --- a/eraser-base/src/main/jastadd/main.relast +++ b/eraser-base/src/main/jastadd/main.relast @@ -6,7 +6,7 @@ User : LabelledModelElement ; rel Root.CurrentUser? -> User ; // ---------------- Util ------------------------------ -ExternalHost ::= <HostName:String> <Port:int> ; +ExternalHost ::= <HostName:String> <Port:int> <UserName:String> <Password:String>; // ---------------- InfluxDB ------------------------------ -InfluxRoot ::= <User:String> <Password:String> <DbName:String> [Host:ExternalHost] ; +InfluxRoot ::= <DbName:String> [Host:ExternalHost] ; diff --git a/eraser-base/src/main/jastadd/mqtt.jrag b/eraser-base/src/main/jastadd/mqtt.jrag index a33f024b510ce0b3fb642a3a2fcae98cf43eb29b..2741a0550c033d4abb4760c267aafc2426a04604 100644 --- a/eraser-base/src/main/jastadd/mqtt.jrag +++ b/eraser-base/src/main/jastadd/mqtt.jrag @@ -48,7 +48,7 @@ aspect MQTT { } else { result = new MQTTSenderStub(); } - return result.setHost(getHost(), getUser(), getPassword()); + return result.setHost(getHost()); } //--- getMqttRoot --- diff --git a/eraser-base/src/main/jastadd/mqtt.relast b/eraser-base/src/main/jastadd/mqtt.relast index 845149403b3576e7503f59eef2a4e59ca1411485..cf477ff72e303415e47f42c939afe26cdfc4ed54 100644 --- a/eraser-base/src/main/jastadd/mqtt.relast +++ b/eraser-base/src/main/jastadd/mqtt.relast @@ -1,4 +1,4 @@ // ---------------- MQTT ------------------------------ -MqttRoot ::= Topic:MqttTopic* <IncomingPrefix:String> <OutgoingPrefix:String> <User:String> <Password:String> [Host:ExternalHost] ; +MqttRoot ::= Topic:MqttTopic* <IncomingPrefix:String> <OutgoingPrefix:String> [Host:ExternalHost] ; MqttTopic ::= <TopicString:String> ; rel Item.Topic? <-> MqttTopic.Item* ; diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MQTTSender.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MQTTSender.java index 5a8d3bd9788728ee9b746347bb8da5da66e5c67b..34d06fe31302b49a46bf920541ab9d849b70d07f 100644 --- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MQTTSender.java +++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MQTTSender.java @@ -15,17 +15,7 @@ public interface MQTTSender extends AutoCloseable { * Sets the host running the MQTT broker (no username/password set). * @param host host name (IP address or domain name) and port */ - default MQTTSender setHost(ExternalHost host) { - return setHost(host, null, null); - } - - /** - * Sets the host, username and password running the MQTT broker. - * @param host host name (IP address or domain name) and port - * @param username username for authentication - * @param password password for authentication - */ - MQTTSender setHost(ExternalHost host, String username, String password); + MQTTSender setHost(ExternalHost host); /** diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MQTTSenderImpl.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MQTTSenderImpl.java index a181424f24826736fe4b3730ae4bc6390a24be7f..9fecbe6913f798a530c29b45be7af793df56e3b1 100644 --- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MQTTSenderImpl.java +++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MQTTSenderImpl.java @@ -29,11 +29,13 @@ public class MQTTSenderImpl implements MQTTSender { private TimeUnit publishTimeoutUnit; @Override - public MQTTSender setHost(ExternalHost host, String username, String password) { + public MQTTSender setHost(ExternalHost host) { /* The host running the MQTT broker. */ URI hostUri = URI.create("tcp://" + host.getHostName() + ":" + host.getPort()); logger.debug("Host is {}", hostUri); MQTT mqtt = new MQTT(); + String username = host.getUserName(); + String password = host.getPassword(); if (username != null && !username.isEmpty()) { mqtt.setUserName(username); } diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MQTTSenderStub.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MQTTSenderStub.java index 745bfcc3c97d485da1b9f3ac3df3bb2a800e47ff..2694b85f8232bb6cb83e20eef9bcd349fa63d63b 100644 --- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MQTTSenderStub.java +++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MQTTSenderStub.java @@ -20,10 +20,12 @@ public class MQTTSenderStub implements MQTTSender { private Logger logger = LogManager.getLogger(MQTTSenderStub.class); private PublishCallback callback; - public MQTTSender setHost(ExternalHost host, String username, String password) { + @Override + public MQTTSender setHost(ExternalHost host) { return this; } + public void setCallback(PublishCallback callback) { this.callback = callback; } diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/openhab2/mqtt/MQTTUpdater.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/openhab2/mqtt/MQTTUpdater.java index 79d19c6d146d8800062da40016f06199aeaf4b51..0952d3c333a06256c3a0fb97181854e43f6a077f 100644 --- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/openhab2/mqtt/MQTTUpdater.java +++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/openhab2/mqtt/MQTTUpdater.java @@ -39,9 +39,7 @@ public class MQTTUpdater implements AutoCloseable { */ public void setRoot(Root root) { ExternalHost host = root.getMqttRoot().getHost(); - delegatee.setHost(host.getHostName(), host.getPort()); - delegatee.setUsername(root.getMqttRoot().getUser()); - delegatee.setPassword(root.getMqttRoot().getPassword()); + delegatee.setHost(host); delegatee.setOnMessage((topicString, message)-> root.getMqttRoot().resolveTopic(topicString).ifPresent(topic -> topic.getItems().forEach( diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/MqttReceiver.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/MqttReceiver.java index 4c448c27b2751190048a15e527c4a15b4da6ee6a..161cbaf16025d56ad5a4f9189ecde65203108051 100644 --- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/MqttReceiver.java +++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/MqttReceiver.java @@ -1,5 +1,6 @@ package de.tudresden.inf.st.eraser.util; +import de.tudresden.inf.st.eraser.jastadd.model.ExternalHost; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.fusesource.hawtbuf.Buffer; @@ -51,18 +52,11 @@ public class MqttReceiver implements AutoCloseable { /** * Sets the host to receive messages from */ - public void setHost(String host, int port) { - this.host = URI.create("tcp://" + host + ":" + port); - logger.debug("Host is {}", this.host); + public void setHost(ExternalHost externalHost) { + this.host = URI.create("tcp://" + externalHost.getHostName() + ":" + externalHost.getPort()); + logger.debug("Host is {}", externalHost.getHostName()); } - public void setUsername(String username) { - this.username = username; - } - - public void setPassword(String password) { - this.password = password; - } public void setOnMessage(BiConsumer<String, String> callback) { this.onMessageCallback = callback; diff --git a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/InfluxTest.java b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/InfluxTest.java index a5647fe4ee23ee8825a17ec5d59de80fb94dd9c7..53079a7a5728796442f79a52549d584742cbd3cc 100644 --- a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/InfluxTest.java +++ b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/InfluxTest.java @@ -170,7 +170,7 @@ public class InfluxTest { influxRoot = InfluxRoot.createDefault(); // use container running influx influxRoot.setDbName(InfluxTest.class.getSimpleName()); - influxRoot.setHostByName(getInfluxHost()); + influxRoot.setHost(new ExternalHost().setHostName(getInfluxHost())); } mai.model.getRoot().setInfluxRoot(influxRoot); assumeTrue(influxRoot.influxAdapter().isConnected()); diff --git a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/MqttTests.java b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/MqttTests.java index 9b6a4ab492036278416ef1d2e2ff8d435a68d39e..04ffc791882a6218d6293de112f5dd4c4beb7616 100644 --- a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/MqttTests.java +++ b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/MqttTests.java @@ -158,7 +158,7 @@ public class MqttTests { } MqttReceiver receiver = new MqttReceiver(); List<String> expectedTopicList = Arrays.asList(expectedTopics); - receiver.setHost(getMqttHost(), 1883); + receiver.setHost(ExternalHost.of(getMqttHost(),1883)); receiver.setTopicsForSubscription(expectedTopics); receiver.setOnMessage((topic, message) -> { assertThat(expectedTopicList).contains(topic); diff --git a/integration/src/main/java/de/tudresden/inf/st/eraser/integration/IntegrationMain.java b/integration/src/main/java/de/tudresden/inf/st/eraser/integration/IntegrationMain.java index af8462acfc90e56d0b596b2bde2322478510aa5c..eda55f454f27382f3c97d105eafa9a14f9861e9d 100644 --- a/integration/src/main/java/de/tudresden/inf/st/eraser/integration/IntegrationMain.java +++ b/integration/src/main/java/de/tudresden/inf/st/eraser/integration/IntegrationMain.java @@ -47,7 +47,7 @@ public class IntegrationMain { InputStream inputStream = IntegrationMain.class.getResourceAsStream(filename); String host = "localhost"; MqttRoot mqttRoot = new MqttRoot(); - mqttRoot.setHostByName(host); + mqttRoot.setHost(new ExternalHost().setHostName(host)); // columns: time,topic,qos,message try (InputStreamReader inputStreamReader = new InputStreamReader(inputStream); CSVReader reader = new CSVReaderBuilder(inputStreamReader) @@ -90,7 +90,7 @@ public class IntegrationMain { // Root model = importFromLocalFile(); logger.debug("Got model: {}", model.getSmartHomeEntityModel().description()); MqttRoot mqttRoot = new MqttRoot(); - mqttRoot.setHostByName("localhost"); + mqttRoot.updateHost("localhost",-1,null,null); mqttRoot.setIncomingPrefix("oh2/out/"); MqttTopic irisStateTopic = new MqttTopic(); irisStateTopic.setTopicString("iris1_item/state");