]> git.basschouten.com Git - openhab-addons.git/commitdiff
[lcn] Fix displaying of "not enough licenses" message (#9761)
authorFabian Wolter <github@fabian-wolter.de>
Tue, 12 Jan 2021 21:05:12 +0000 (22:05 +0100)
committerGitHub <noreply@github.com>
Tue, 12 Jan 2021 21:05:12 +0000 (22:05 +0100)
Signed-off-by: Fabian Wolter <github@fabian-wolter.de>
bundles/org.openhab.binding.lcn/src/main/java/org/openhab/binding/lcn/internal/connection/AbstractConnectionState.java
bundles/org.openhab.binding.lcn/src/main/java/org/openhab/binding/lcn/internal/connection/AbstractConnectionStateSendCredentials.java
bundles/org.openhab.binding.lcn/src/main/java/org/openhab/binding/lcn/internal/connection/ConnectionStateConnecting.java
bundles/org.openhab.binding.lcn/src/main/java/org/openhab/binding/lcn/internal/connection/ConnectionStateGracePeriodBeforeReconnect.java
bundles/org.openhab.binding.lcn/src/main/java/org/openhab/binding/lcn/internal/connection/ConnectionStateMachine.java
bundles/org.openhab.binding.lcn/src/main/java/org/openhab/binding/lcn/internal/connection/ConnectionStateShutdown.java
bundles/org.openhab.binding.lcn/src/main/java/org/openhab/binding/lcn/internal/connection/ConnectionStateWaitForLcnBusConnected.java

index 78c1e0cc2ba0029808e3d189ba1b951007ba190c..e2151f1a5f7bc293ca39bed60f3a3775d9e166f3 100644 (file)
@@ -17,6 +17,7 @@ import java.nio.channels.Channel;
 import java.util.concurrent.ScheduledExecutorService;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.lcn.internal.common.LcnAddr;
 import org.openhab.binding.lcn.internal.common.LcnDefs;
 
@@ -84,6 +85,23 @@ public abstract class AbstractConnectionState extends AbstractState<ConnectionSt
         }
     }
 
+    /**
+     * Invoked by any state, if the connection fails.
+     *
+     * @param e the cause
+     */
+    public void handleConnectionFailed(@Nullable Throwable e) {
+        synchronized (context) {
+            if (e != null) {
+                String message = e.getMessage();
+                connection.getCallback().onOffline(message != null ? message : "");
+            } else {
+                connection.getCallback().onOffline("");
+            }
+            context.setState(ConnectionStateGracePeriodBeforeReconnect::new);
+        }
+    }
+
     /**
      * Closes the Connection SocketChannel.
      */
index ab91729bb000bd2a3ddd8047de4b9db0304ad212..b0b79782490124144c6a00c8db10091bc1a565bd 100644 (file)
@@ -41,7 +41,7 @@ public abstract class AbstractConnectionStateSendCredentials extends AbstractCon
      */
     protected void startTimeoutTimer() {
         addTimer(getScheduler().schedule(
-                () -> context.handleConnectionFailed(
+                () -> handleConnectionFailed(
                         new LcnException("Network timeout in state " + getClass().getSimpleName())),
                 connection.getSettings().getTimeout(), TimeUnit.MILLISECONDS));
     }
index aee67ed1c3bd4ac7517775876f47900a1121116b..26b9c00c7451950e09bbf5028cab8dd235137a93 100644 (file)
@@ -86,7 +86,7 @@ public class ConnectionStateConnecting extends AbstractConnectionState {
             message = e.getMessage();
         }
         connection.getCallback().onOffline(Objects.requireNonNullElse(message, ""));
-        context.handleConnectionFailed(e);
+        handleConnectionFailed(e);
     }
 
     @Override
index 3781a533774a555fba6e82fc4d8d46c6d6b046b8..34775b7cb5f7adba3708d1605334ccf8bd79ee8d 100644 (file)
@@ -15,6 +15,7 @@ package org.openhab.binding.lcn.internal.connection;
 import java.util.concurrent.TimeUnit;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
 
 /**
  * This state is active when the connection failed. A grace period is enforced to prevent fast cycling through the
@@ -42,4 +43,9 @@ public class ConnectionStateGracePeriodBeforeReconnect extends AbstractConnectio
     public void onPckMessageReceived(String data) {
         // nothing
     }
+
+    @Override
+    public void handleConnectionFailed(@Nullable Throwable e) {
+        // nothing
+    }
 }
index cb75755433d95ee8366ead956324d0e2ed038851..5e97faf0cc7312f788defb740d0a8618a5b0c0cd 100644 (file)
@@ -46,7 +46,7 @@ public class ConnectionStateMachine extends AbstractStateMachine<ConnectionState
 
     /**
      * Gets the PCHK Connection object.
-     * 
+     *
      * @return the connection
      */
     public Connection getConnection() {
@@ -72,15 +72,10 @@ public class ConnectionStateMachine extends AbstractStateMachine<ConnectionState
      *
      * @param e the cause
      */
-    public void handleConnectionFailed(@Nullable Throwable e) {
-        if (!(state instanceof ConnectionStateShutdown)) {
-            if (e != null) {
-                String message = e.getMessage();
-                connection.getCallback().onOffline(message != null ? message : "");
-            } else {
-                connection.getCallback().onOffline("");
-            }
-            setState(ConnectionStateGracePeriodBeforeReconnect::new);
+    public synchronized void handleConnectionFailed(@Nullable Throwable e) {
+        AbstractConnectionState localState = state;
+        if (localState != null) {
+            localState.handleConnectionFailed(e);
         }
     }
 
index 7179b07bff15d2001f0a3df998563a41afcdc98f..37048176e6663b86c50ea29939103502301334fe 100644 (file)
@@ -13,6 +13,7 @@
 package org.openhab.binding.lcn.internal.connection;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.lcn.internal.common.LcnAddr;
 
 /**
@@ -42,4 +43,9 @@ public class ConnectionStateShutdown extends AbstractConnectionState {
     public void onPckMessageReceived(String data) {
         // nothing
     }
+
+    @Override
+    public void handleConnectionFailed(@Nullable Throwable e) {
+        // nothing
+    }
 }
index 61ff6a93f7518a476f386bd46877797521b556dc..2eadfb1da1c077b1a81cfbf76eda9b6310bf6381 100644 (file)
@@ -48,21 +48,28 @@ public class ConnectionStateWaitForLcnBusConnected extends AbstractConnectionSta
 
     @Override
     public void onPckMessageReceived(String data) {
+        switch (data) {
+            case LcnDefs.LCNCONNSTATE_DISCONNECTED:
+                cancelLegacyTimer();
+                connection.getCallback().onOffline("LCN bus not connected to LCN-PCHK/PKE");
+                break;
+            case LcnDefs.LCNCONNSTATE_CONNECTED:
+                cancelLegacyTimer();
+                connection.getCallback().onOnline();
+                nextState(ConnectionStateSendDimMode::new);
+                break;
+            case LcnDefs.INSUFFICIENT_LICENSES:
+                cancelLegacyTimer();
+                handleConnectionFailed(
+                        new LcnException("LCN-PCHK/PKE has not enough licenses to handle this connection"));
+                break;
+        }
+    }
+
+    private void cancelLegacyTimer() {
         ScheduledFuture<?> localLegacyTimer = legacyTimer;
-        if (data.equals(LcnDefs.LCNCONNSTATE_DISCONNECTED)) {
-            if (localLegacyTimer != null) {
-                localLegacyTimer.cancel(true);
-            }
-            connection.getCallback().onOffline("LCN bus not connected to LCN-PCHK/PKE");
-        } else if (data.equals(LcnDefs.LCNCONNSTATE_CONNECTED)) {
-            if (localLegacyTimer != null) {
-                localLegacyTimer.cancel(true);
-            }
-            connection.getCallback().onOnline();
-            nextState(ConnectionStateSendDimMode::new);
-        } else if (data.equals(LcnDefs.INSUFFICIENT_LICENSES)) {
-            context.handleConnectionFailed(
-                    new LcnException("LCN-PCHK/PKE has not enough licenses to handle this connection"));
+        if (localLegacyTimer != null) {
+            localLegacyTimer.cancel(true);
         }
     }
 }