- * For now tls connections are offered with an accept-all trust manager
- * and a predefined keystore if "secure" is set to true.
- *
- * @author David Graeff - Initial contribution
- */
-@Component(service = EmbeddedBrokerService.class, configurationPid = Constants.PID, //
- property = org.osgi.framework.Constants.SERVICE_PID + "=" + Constants.PID)
-@ConfigurableService(category = "MQTT", label = "MQTT Embedded Broker", description_uri = "mqtt:mqttembeddedbroker")
-@NonNullByDefault
-public class EmbeddedBrokerService
- implements MqttConnectionObserver, MqttServiceObserver, MqttEmbeddedBrokerStartedListener {
- private final MqttService service;
- private String persistenceFilename = "";
- // private NetworkServerTls networkServerTls; //TODO wait for NetworkServerTls implementation
-
- @NonNullByDefault({})
- class BrokerMetricsListenerEx implements InterceptHandler {
-
- @Override
- public String getID() {
- return "logger";
- }
-
- @Override
- public Class>[] getInterceptedMessageTypes() {
- return new Class>[] { InterceptConnectMessage.class, InterceptDisconnectMessage.class };
- }
-
- @Override
- public void onConnect(InterceptConnectMessage arg0) {
- logger.debug("MQTT Client connected: {}", arg0.getClientID());
- }
-
- @Override
- public void onConnectionLost(InterceptConnectionLostMessage arg0) {
- }
-
- @Override
- public void onDisconnect(InterceptDisconnectMessage arg0) {
- logger.debug("MQTT Client disconnected: {}", arg0.getClientID());
- }
-
- @Override
- public void onMessageAcknowledged(InterceptAcknowledgedMessage arg0) {
- }
-
- @Override
- public void onPublish(InterceptPublishMessage arg0) {
- }
-
- @Override
- public void onSubscribe(InterceptSubscribeMessage arg0) {
- }
-
- @Override
- public void onUnsubscribe(InterceptUnsubscribeMessage arg0) {
- }
- }
-
- protected @Nullable Server server;
- private final Logger logger = LoggerFactory.getLogger(EmbeddedBrokerService.class);
- protected MqttEmbeddedBrokerDetectStart detectStart = new MqttEmbeddedBrokerDetectStart(this);
- protected BrokerMetricsListenerEx metrics = new BrokerMetricsListenerEx();
-
- private @Nullable MqttBrokerConnection connection;
-
- @Activate
- public EmbeddedBrokerService(@Reference MqttService mqttService, Map
- * If a context is requested by Moquette, this creator
- * will use the bundled "serverkeystore.keystore" with password "openhab".
- *
- * @return An SslContext creator (not be confused with javas SSLContext).
- */
- ISslContextCreator nettySSLcontextCreator() {
- return () -> {
- try {
- InputStream inputStream = getClass().getClassLoader().getResourceAsStream("serverkeystore.keystore");
- KeyStore keyStore = KeyStore.getInstance("jks");
- keyStore.load(inputStream, "openhab".toCharArray());
- KeyManagerFactory factory = KeyManagerFactory.getInstance("SunX509");
- factory.init(keyStore, "openhab".toCharArray());
- return SslContextBuilder.forServer(factory).build();
- } catch (NoSuchAlgorithmException | CertificateException | IOException | KeyStoreException
- | UnrecoverableKeyException e) {
- logger.warn("Failed to create an SSL context");
- return null;
- }
- };
- }
-
- public void startEmbeddedServer(@Nullable Integer portParam, boolean secure, @Nullable String username,
- @Nullable String password) throws IOException {
- Server server = new Server();
- Properties properties = new Properties();
-
- // Host and port
- properties.put(BrokerConstants.HOST_PROPERTY_NAME, "0.0.0.0");
- int port;
- if (secure) {
- port = (portParam == null) ? port = 8883 : portParam;
- properties.put(BrokerConstants.SSL_PORT_PROPERTY_NAME, Integer.toString(port));
- properties.put(BrokerConstants.PORT_PROPERTY_NAME, BrokerConstants.DISABLED_PORT_BIND);
- properties.put(BrokerConstants.KEY_MANAGER_PASSWORD_PROPERTY_NAME, "esheshesh");
- properties.put(BrokerConstants.JKS_PATH_PROPERTY_NAME, "serverkeystore.jks");
- } else {
- port = (portParam == null) ? port = 1883 : portParam;
- // with SSL_PORT_PROPERTY_NAME set, netty tries to evaluate the SSL context and shuts down immediately.
- // properties.put(BrokerConstants.SSL_PORT_PROPERTY_NAME, BrokerConstants.DISABLED_PORT_BIND);
- properties.put(BrokerConstants.PORT_PROPERTY_NAME, Integer.toString(port));
- }
-
- // Authentication
- IAuthenticator authentificator = null;
- if (username != null && password != null && username.length() > 0 && password.length() > 0) {
- properties.setProperty(BrokerConstants.ALLOW_ANONYMOUS_PROPERTY_NAME, Boolean.FALSE.toString());
- properties.put(BrokerConstants.AUTHENTICATOR_CLASS_NAME,
- MqttEmbeddedBrokerUserAuthenticator.class.getName());
- authentificator = new MqttEmbeddedBrokerUserAuthenticator(username, password.getBytes());
- logger.debug("Broker authentication is enabled");
- } else {
- properties.put(BrokerConstants.ALLOW_ANONYMOUS_PROPERTY_NAME, Boolean.TRUE.toString());
- logger.debug("Broker anonymous access enabled");
- }
-
- if (!persistenceFilename.isEmpty()) { // Persistence: If not set, an in-memory database is used.
- properties.put(BrokerConstants.PERSISTENT_STORE_PROPERTY_NAME, persistenceFilename);
- properties.put(BrokerConstants.AUTOSAVE_INTERVAL_PROPERTY_NAME, "30"); // in seconds
- }
-
- // We may provide ACL functionality at some point as well
- IAuthorizatorPolicy authorizer = null;
- ISslContextCreator sslContextCreator = secure ? nettySSLcontextCreator() : null;
-
- try {
- server.startServer(new MemoryConfig(properties), null, sslContextCreator, authentificator, authorizer);
- } catch (IllegalArgumentException e) {
- if (e.getMessage().contains("Could not deserialize")) {
- Path persistenceFilePath = Paths.get((new File(persistenceFilename)).getAbsolutePath());
- logger.warn("persistence corrupt: {}, deleting {}", e.getMessage(), persistenceFilePath);
- Files.delete(persistenceFilePath);
- // retry starting broker, if it fails again, don't catch exception
- server.startServer(new MemoryConfig(properties), null, sslContextCreator, authentificator, authorizer);
- }
- } catch (Exception e) {
- logger.warn("Failed to start embedded MQTT server: {}", e.getMessage());
- server.stopServer();
- return;
- }
-
- this.server = server;
- server.addInterceptHandler(metrics);
- ScheduledExecutorService s = new ScheduledThreadPoolExecutor(1);
- detectStart.startBrokerStartedDetection(port, s);
- }
-
- public void stopEmbeddedServer() {
- Server server = this.server;
- if (server != null) {
- server.removeInterceptHandler(metrics);
- detectStart.stopBrokerStartDetection();
- server.stopServer();
- this.server = null;
- }
- }
-
- /**
- * For testing: Returns true if the embedded server confirms that the MqttBrokerConnection is connected.
- */
- protected boolean serverConfirmsEmbeddedClient() {
- return server != null && server.listConnectedClients().stream()
- .anyMatch(client -> Constants.CLIENTID.equals(client.getClientID()));
- }
-
- @Override
- public void connectionStateChanged(MqttConnectionState state, @Nullable Throwable error) {
- if (state == MqttConnectionState.CONNECTED) {
- logger.debug("Embedded broker connection connected");
- } else if (state == MqttConnectionState.CONNECTING) {
- logger.debug("Embedded broker connection still connecting");
- } else {
- if (error == null) {
- logger.warn("Embedded broker offline - Reason unknown");
- } else {
- logger.warn("Embedded broker offline", error);
- }
- }
-
- if (state != MqttConnectionState.CONNECTED && state != MqttConnectionState.CONNECTING) {
- stopEmbeddedServer();
- }
- }
-
- /**
- * The callback from the detectStart.startBrokerStartedDetection() call within
- * {@link #startEmbeddedServer(Integer, boolean, String, String, String)}.
- */
- @Override
- public void mqttEmbeddedBrokerStarted(boolean timeout) {
- MqttBrokerConnection connection = this.connection;
- MqttService service = this.service;
- if (connection == null || service == null) {
- return;
- }
- service.addBrokerConnection(Constants.CLIENTID, connection);
-
- connection.start().exceptionally(e -> {
- connectionStateChanged(MqttConnectionState.DISCONNECTED, e);
- return false;
- }).thenAccept(v -> {
- if (!v) {
- connectionStateChanged(MqttConnectionState.DISCONNECTED, new TimeoutException("Timeout"));
- }
- });
- }
-
- public @Nullable MqttBrokerConnection getConnection() {
- return connection;
- }
-
- public String getPersistenceFilename() {
- return persistenceFilename;
- }
-
- public void setPersistenceFilename(String persistenceFilename) {
- this.persistenceFilename = persistenceFilename;
- }
-}
diff --git a/bundles/org.openhab.io.mqttembeddedbroker/src/main/java/org/openhab/io/mqttembeddedbroker/internal/MqttEmbeddedBrokerDetectStart.java b/bundles/org.openhab.io.mqttembeddedbroker/src/main/java/org/openhab/io/mqttembeddedbroker/internal/MqttEmbeddedBrokerDetectStart.java
deleted file mode 100644
index f55b4389a..000000000
--- a/bundles/org.openhab.io.mqttembeddedbroker/src/main/java/org/openhab/io/mqttembeddedbroker/internal/MqttEmbeddedBrokerDetectStart.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/**
- * Copyright (c) 2010-2020 Contributors to the openHAB project
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- */
-package org.openhab.io.mqttembeddedbroker.internal;
-
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-import java.net.SocketAddress;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledFuture;
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.eclipse.jdt.annotation.Nullable;
-
-import io.moquette.broker.Server;
-
-/**
- * Unfortunately there is no listener interface for the Moquette MQTT Broker
- * to get notified when it is started and ready to accept connections.
- * We therefore try to connect to the socket with a Socket object until a timeout is reached.
- *
- * @author David Graeff - Inital contriution
- */
-@NonNullByDefault
-public class MqttEmbeddedBrokerDetectStart {
- protected @Nullable Server server;
- protected final MqttEmbeddedBrokerStartedListener startedListener;
- protected long startTime;
- protected int port;
- protected int timeout = 2000;
- protected @Nullable ScheduledExecutorService scheduler;
- protected @Nullable ScheduledFuture> schedule;
-
- /**
- * Implement this interface to be notified if a connection to the given tcp port can be established.
- */
- public static interface MqttEmbeddedBrokerStartedListener {
- public void mqttEmbeddedBrokerStarted(boolean timeout);
- }
-
- /**
- * Registers the given listener. Start with {@link #startBrokerStartedDetection(int, ScheduledExecutorService)}.
- *
- * @param startedListener A listener
- */
- public MqttEmbeddedBrokerDetectStart(MqttEmbeddedBrokerStartedListener startedListener) {
- this.startedListener = startedListener;
- }
-
- /**
- * Performs a tcp socket open/close process. Will notify the registered listener on success
- * and retry until a timeout is reached otherwise.
- */
- protected void servicePing() {
- ScheduledExecutorService scheduler = this.scheduler;
- if (scheduler == null) {
- return;
- }
-
- try {
- SocketAddress socketAddress = new InetSocketAddress("127.0.0.1", port);
- Socket socket = new Socket();
- socket.connect(socketAddress, 500);
- socket.close();
- schedule = null;
- startedListener.mqttEmbeddedBrokerStarted(false);
- return;
- } catch (IOException ignored) {
- }
- if (System.currentTimeMillis() - startTime < timeout) {
- schedule = scheduler.schedule(() -> servicePing(), 100, TimeUnit.MILLISECONDS);
- } else {
- startedListener.mqttEmbeddedBrokerStarted(true);
- }
- }
-
- /**
- * Start the broker server reachable detection
- *
- * @param port The Mqtt Server port
- * @param scheduler A scheduler
- */
- public void startBrokerStartedDetection(int port, ScheduledExecutorService scheduler) {
- this.port = port;
- this.scheduler = scheduler;
- this.startTime = System.currentTimeMillis();
- this.schedule = null;
- servicePing();
- }
-
- /**
- * Stops the broker server reachable detection if it is still running.
- */
- public void stopBrokerStartDetection() {
- if (schedule != null) {
- schedule.cancel(true);
- schedule = null;
- }
- }
-}
diff --git a/bundles/org.openhab.io.mqttembeddedbroker/src/main/java/org/openhab/io/mqttembeddedbroker/internal/MqttEmbeddedBrokerUserAuthenticator.java b/bundles/org.openhab.io.mqttembeddedbroker/src/main/java/org/openhab/io/mqttembeddedbroker/internal/MqttEmbeddedBrokerUserAuthenticator.java
deleted file mode 100644
index 8c9c7b069..000000000
--- a/bundles/org.openhab.io.mqttembeddedbroker/src/main/java/org/openhab/io/mqttembeddedbroker/internal/MqttEmbeddedBrokerUserAuthenticator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * Copyright (c) 2010-2020 Contributors to the openHAB project
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- */
-package org.openhab.io.mqttembeddedbroker.internal;
-
-import java.util.Arrays;
-
-import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.eclipse.jdt.annotation.Nullable;
-
-import io.moquette.broker.security.IAuthenticator;
-
-/**
- * Provides a {@link IAuthenticator} for the Moquette server, that accepts given user name and password.
- * If ESH gains user credentials at some point, those should be accepted as well.
- *
- * @author David Graeff - Initial contribution
- */
-@NonNullByDefault
-public class MqttEmbeddedBrokerUserAuthenticator implements IAuthenticator {
- final String username;
- final byte[] password;
-
- public MqttEmbeddedBrokerUserAuthenticator(String username, byte[] password) {
- this.username = username;
- this.password = password;
- }
-
- @Override
- public boolean checkValid(@Nullable String clientId, @Nullable String username, byte @Nullable [] password) {
- return this.username.equals(username) && Arrays.equals(this.password, password);
- }
-}
diff --git a/bundles/org.openhab.io.mqttembeddedbroker/src/main/java/org/openhab/io/mqttembeddedbroker/internal/ServiceConfiguration.java b/bundles/org.openhab.io.mqttembeddedbroker/src/main/java/org/openhab/io/mqttembeddedbroker/internal/ServiceConfiguration.java
deleted file mode 100644
index 06a846e1d..000000000
--- a/bundles/org.openhab.io.mqttembeddedbroker/src/main/java/org/openhab/io/mqttembeddedbroker/internal/ServiceConfiguration.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * Copyright (c) 2010-2020 Contributors to the openHAB project
- *
- * See the NOTICE file(s) distributed with this work for additional
- * information.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0
- *
- * SPDX-License-Identifier: EPL-2.0
- */
-package org.openhab.io.mqttembeddedbroker.internal;
-
-import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.eclipse.jdt.annotation.Nullable;
-
-/**
- * Configuration of the {@link EmbeddedBrokerService}.
- *
- * @author David Graeff - Initial contribution
- */
-@NonNullByDefault
-public class ServiceConfiguration {
- public @Nullable Integer port;
- public Boolean secure = false;
- public String persistenceFile = "mqttembedded.bin";
-
- public @Nullable String username;
- public @Nullable String password;
-}
diff --git a/bundles/org.openhab.io.mqttembeddedbroker/src/main/resources/OH-INF/config/config.xml b/bundles/org.openhab.io.mqttembeddedbroker/src/main/resources/OH-INF/config/config.xml
deleted file mode 100644
index 1ff43ded5..000000000
--- a/bundles/org.openhab.io.mqttembeddedbroker/src/main/resources/OH-INF/config/config.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
+ * MqttBrokerConnection c = mqttService.getBrokerConnection(Constants.CLIENTID); + *+ */ + public static final String CLIENTID = "embedded-mqtt-broker"; + + /** + * The broker persistent identifier used for identifying configurations. + */ + public static final String PID = "org.openhab.core.mqttembeddedbroker"; + + /** + * The configuration key used for configuring the embedded broker port. + */ + public static final String PORT = "port"; +} diff --git a/itests/org.openhab.binding.mqtt.homie.tests/src/main/java/org/openhab/binding/mqtt/EmbeddedBrokerTools.java b/itests/org.openhab.binding.mqtt.homie.tests/src/main/java/org/openhab/binding/mqtt/EmbeddedBrokerTools.java index de7e511ad..4d29d9935 100644 --- a/itests/org.openhab.binding.mqtt.homie.tests/src/main/java/org/openhab/binding/mqtt/EmbeddedBrokerTools.java +++ b/itests/org.openhab.binding.mqtt.homie.tests/src/main/java/org/openhab/binding/mqtt/EmbeddedBrokerTools.java @@ -27,7 +27,6 @@ import org.openhab.core.io.transport.mqtt.MqttConnectionObserver; import org.openhab.core.io.transport.mqtt.MqttConnectionState; import org.openhab.core.io.transport.mqtt.MqttService; import org.openhab.core.io.transport.mqtt.MqttServiceObserver; -import org.openhab.io.mqttembeddedbroker.Constants; import org.osgi.service.cm.Configuration; import org.osgi.service.cm.ConfigurationAdmin; diff --git a/itests/org.openhab.io.mqttembeddedbroker.tests/NOTICE b/itests/org.openhab.io.mqttembeddedbroker.tests/NOTICE deleted file mode 100644 index 38d625e34..000000000 --- a/itests/org.openhab.io.mqttembeddedbroker.tests/NOTICE +++ /dev/null @@ -1,13 +0,0 @@ -This content is produced and maintained by the openHAB project. - -* Project home: https://www.openhab.org - -== Declared Project Licenses - -This program and the accompanying materials are made available under the terms -of the Eclipse Public License 2.0 which is available at -https://www.eclipse.org/legal/epl-2.0/. - -== Source Code - -https://github.com/openhab/openhab-addons diff --git a/itests/org.openhab.io.mqttembeddedbroker.tests/itest.bndrun b/itests/org.openhab.io.mqttembeddedbroker.tests/itest.bndrun deleted file mode 100644 index c3fa9880c..000000000 --- a/itests/org.openhab.io.mqttembeddedbroker.tests/itest.bndrun +++ /dev/null @@ -1,78 +0,0 @@ --include: ../itest-common.bndrun - -Bundle-SymbolicName: ${project.artifactId} -Fragment-Host: org.openhab.io.mqttembeddedbroker - --runrequires: \ - bnd.identity;id='org.openhab.io.mqttembeddedbroker.tests' - -# We would like to use the "volatile" storage only --runblacklist: \ - bnd.identity;id='org.openhab.core.storage.json' - --runvm: \ - -Dio.netty.noUnsafe=true,\ - -Dmqttembeddedbroker.port=${mqttembeddedbroker.port} - -# -# done -# --runbundles: \ - ch.qos.logback.core;version='[1.2.3,1.2.4)',\ - com.google.gson;version='[2.8.2,2.8.3)',\ - com.h2database.mvstore;version='[1.4.199,1.4.200)',\ - io.netty.buffer;version='[4.1.42,4.1.43)',\ - io.netty.codec;version='[4.1.42,4.1.43)',\ - io.netty.codec-mqtt;version='[4.1.42,4.1.43)',\ - io.netty.common;version='[4.1.42,4.1.43)',\ - io.netty.handler;version='[4.1.42,4.1.43)',\ - io.netty.resolver;version='[4.1.42,4.1.43)',\ - io.netty.transport;version='[4.1.42,4.1.43)',\ - javax.measure.unit-api;version='[1.0.0,1.0.1)',\ - org.apache.felix.configadmin;version='[1.9.8,1.9.9)',\ - org.apache.felix.http.servlet-api;version='[1.1.2,1.1.3)',\ - org.apache.felix.scr;version='[2.1.10,2.1.11)',\ - org.eclipse.equinox.event;version='[1.4.300,1.4.301)',\ - org.objenesis;version='[2.6.0,2.6.1)',\ - org.osgi.service.event;version='[1.4.0,1.4.1)',\ - slf4j.api;version='[1.7.25,1.7.26)',\ - tec.uom.lib.uom-lib-common;version='[1.0.3,1.0.4)',\ - tec.uom.se;version='[1.0.10,1.0.11)',\ - ch.qos.logback.classic;version='[1.2.3,1.2.4)',\ - biz.aQute.tester.junit-platform;version='[5.1.2,5.1.3)',\ - com.google.dagger;version='[2.20.0,2.20.1)',\ - com.hivemq.client.mqtt;version='[1.1.2,1.1.3)',\ - io.netty.codec-http;version='[4.1.34,4.1.35)',\ - io.netty.transport-native-epoll;version='[4.1.34,4.1.35)',\ - io.netty.transport-native-unix-common;version='[4.1.34,4.1.35)',\ - io.reactivex.rxjava2.rxjava;version='[2.2.5,2.2.6)',\ - junit-jupiter-api;version='[5.6.2,5.6.3)',\ - junit-jupiter-engine;version='[5.6.2,5.6.3)',\ - junit-platform-commons;version='[1.6.2,1.6.3)',\ - junit-platform-engine;version='[1.6.2,1.6.3)',\ - junit-platform-launcher;version='[1.6.2,1.6.3)',\ - net.bytebuddy.byte-buddy;version='[1.10.13,1.10.14)',\ - net.bytebuddy.byte-buddy-agent;version='[1.10.13,1.10.14)',\ - org.apache.commons.codec;version='[1.10.0,1.10.1)',\ - org.eclipse.jetty.http;version='[9.4.20,9.4.21)',\ - org.eclipse.jetty.io;version='[9.4.20,9.4.21)',\ - org.eclipse.jetty.security;version='[9.4.20,9.4.21)',\ - org.eclipse.jetty.server;version='[9.4.20,9.4.21)',\ - org.eclipse.jetty.servlet;version='[9.4.20,9.4.21)',\ - org.eclipse.jetty.util;version='[9.4.20,9.4.21)',\ - org.glassfish.hk2.external.javax.inject;version='[2.4.0,2.4.1)',\ - org.hamcrest;version='[2.2.0,2.2.1)',\ - org.jctools.core;version='[2.1.2,2.1.3)',\ - org.mockito.mockito-core;version='[3.4.6,3.4.7)',\ - org.openhab.core;version='[3.0.0,3.0.1)',\ - org.openhab.core.config.core;version='[3.0.0,3.0.1)',\ - org.openhab.core.io.transport.mqtt;version='[3.0.0,3.0.1)',\ - org.openhab.core.test;version='[3.0.0,3.0.1)',\ - org.openhab.io.mqttembeddedbroker;version='[3.0.0,3.0.1)',\ - org.openhab.io.mqttembeddedbroker.tests;version='[3.0.0,3.0.1)',\ - org.opentest4j;version='[1.2.0,1.2.1)',\ - org.reactivestreams.reactive-streams;version='[1.0.2,1.0.3)',\ - com.sun.xml.bind.jaxb-osgi;version='[2.3.3,2.3.4)',\ - jakarta.xml.bind-api;version='[2.3.3,2.3.4)',\ - org.glassfish.hk2.osgi-resource-locator;version='[1.0.1,1.0.2)',\ - org.apache.servicemix.specs.activation-api-1.2.1;version='[1.2.1,1.2.2)' diff --git a/itests/org.openhab.io.mqttembeddedbroker.tests/pom.xml b/itests/org.openhab.io.mqttembeddedbroker.tests/pom.xml deleted file mode 100644 index 3b7d7792d..000000000 --- a/itests/org.openhab.io.mqttembeddedbroker.tests/pom.xml +++ /dev/null @@ -1,92 +0,0 @@ - -