From 1f928f99d6eecb1ce1b8a4372ae8b977a742c41c Mon Sep 17 00:00:00 2001
From: Manuel Krombholz <s3866577@msx.tu-dresden.de>
Date: Tue, 1 Jun 2021 03:45:57 +0200
Subject: [PATCH] Moved pw and username to ExternalHost

---
 eraser-base/src/main/jastadd/ItemHistory.jrag |  9 +++-
 eraser-base/src/main/jastadd/Printing.jrag    | 19 +++----
 eraser-base/src/main/jastadd/Util.jrag        | 51 ++++++++++++++++---
 eraser-base/src/main/jastadd/eraser.parser    | 12 ++---
 eraser-base/src/main/jastadd/main.relast      |  4 +-
 eraser-base/src/main/jastadd/mqtt.jrag        |  2 +-
 eraser-base/src/main/jastadd/mqtt.relast      |  2 +-
 .../st/eraser/jastadd/model/MQTTSender.java   | 12 +----
 .../eraser/jastadd/model/MQTTSenderImpl.java  |  4 +-
 .../eraser/jastadd/model/MQTTSenderStub.java  |  4 +-
 .../st/eraser/openhab2/mqtt/MQTTUpdater.java  |  4 +-
 .../inf/st/eraser/util/MqttReceiver.java      | 14 ++---
 .../tudresden/inf/st/eraser/InfluxTest.java   |  2 +-
 .../de/tudresden/inf/st/eraser/MqttTests.java |  2 +-
 .../eraser/integration/IntegrationMain.java   |  4 +-
 15 files changed, 88 insertions(+), 57 deletions(-)

diff --git a/eraser-base/src/main/jastadd/ItemHistory.jrag b/eraser-base/src/main/jastadd/ItemHistory.jrag
index 02f226f8..60d38ad9 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 ba63b98b..a1f43ee2 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 201582e3..4973711b 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 019e0c30..573db220 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 e12d23dc..6573bd4d 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 a33f024b..2741a055 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 84514940..cf477ff7 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 5a8d3bd9..34d06fe3 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 a181424f..9fecbe69 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 745bfcc3..2694b85f 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 79d19c6d..0952d3c3 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 4c448c27..161cbaf1 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 a5647fe4..53079a7a 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 9b6a4ab4..04ffc791 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 af8462ac..eda55f45 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");
-- 
GitLab