From c8d9962fea2adf85fc7a87c0f789df1231a5a3d3 Mon Sep 17 00:00:00 2001
From: rschoene <rene.schoene@tu-dresden.de>
Date: Thu, 2 Jul 2020 10:13:47 +0200
Subject: [PATCH] Add user and password to mqtt settings.

---
 eraser-base/src/main/jastadd/eraser.parser        |  2 ++
 eraser-base/src/main/jastadd/mqtt.jrag            |  2 +-
 eraser-base/src/main/jastadd/mqtt.relast          |  2 +-
 .../inf/st/eraser/jastadd/model/MQTTSender.java   | 15 +++++++++++++--
 .../st/eraser/jastadd/model/MQTTSenderImpl.java   |  8 +++++++-
 .../st/eraser/jastadd/model/MQTTSenderStub.java   |  2 +-
 6 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/eraser-base/src/main/jastadd/eraser.parser b/eraser-base/src/main/jastadd/eraser.parser
index 0cc98445..5c275fa8 100644
--- a/eraser-base/src/main/jastadd/eraser.parser
+++ b/eraser-base/src/main/jastadd/eraser.parser
@@ -227,6 +227,8 @@ MqttRoot mqtt_root_body =
      INCOMING EQUALS TEXT.n mqtt_root_body.mrb          {: mrb.setIncomingPrefix(n); return mrb; :}
   |  OUTGOING EQUALS TEXT.n mqtt_root_body.mrb          {: mrb.setOutgoingPrefix(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; :}
   |                                                     {: return new MqttRoot(); :}
   ;
 
diff --git a/eraser-base/src/main/jastadd/mqtt.jrag b/eraser-base/src/main/jastadd/mqtt.jrag
index 2d3f6fce..93e11442 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());
+    return result.setHost(getHost(), getUser(), getPassword());
   }
 
   //--- getMqttRoot ---
diff --git a/eraser-base/src/main/jastadd/mqtt.relast b/eraser-base/src/main/jastadd/mqtt.relast
index cf477ff7..84514940 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> [Host:ExternalHost] ;
+MqttRoot ::= Topic:MqttTopic* <IncomingPrefix:String> <OutgoingPrefix:String> <User:String> <Password: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 0f26efbe..5a8d3bd9 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
@@ -12,10 +12,21 @@ import java.util.concurrent.TimeUnit;
 public interface MQTTSender extends AutoCloseable {
 
   /**
-   * Sets the host running the MQTT broker.
+   * Sets the host running the MQTT broker (no username/password set).
    * @param host host name (IP address or domain name) and port
    */
-  MQTTSender setHost(ExternalHost host);
+  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);
+
 
   /**
    * Set the timeout used for connecting and disconnecting.
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 496d2a1c..a181424f 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,17 @@ public class MQTTSenderImpl implements MQTTSender {
   private TimeUnit publishTimeoutUnit;
 
   @Override
-  public MQTTSender setHost(ExternalHost host) {
+  public MQTTSender setHost(ExternalHost host, String username, String password) {
     /* The host running the MQTT broker. */
     URI hostUri = URI.create("tcp://" + host.getHostName() + ":" + host.getPort());
     logger.debug("Host is {}", hostUri);
     MQTT mqtt = new MQTT();
+    if (username != null && !username.isEmpty()) {
+      mqtt.setUserName(username);
+    }
+    if (password != null && !password.isEmpty()) {
+      mqtt.setPassword(password);
+    }
     mqtt.setHost(hostUri);
     connection = mqtt.futureConnection();
     setConnectTimeout(2, TimeUnit.SECONDS);
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 2673e606..745bfcc3 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,7 +20,7 @@ public class MQTTSenderStub implements MQTTSender {
   private Logger logger = LogManager.getLogger(MQTTSenderStub.class);
   private PublishCallback callback;
 
-  public MQTTSender setHost(ExternalHost host) {
+  public MQTTSender setHost(ExternalHost host, String username, String password) {
     return this;
   }
 
-- 
GitLab