import java.util.Map;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
private final Logger logger = LoggerFactory.getLogger(HarmonyHubHandler.class);
- public static final Set<ThingTypeUID> SUPPORTED_THING_TYPES_UIDS = Collections.singleton(HARMONY_HUB_THING_TYPE);
+ public static final Set<ThingTypeUID> SUPPORTED_THING_TYPES_UIDS = Set.of(HARMONY_HUB_THING_TYPE);
private static final Comparator<Activity> ACTIVITY_COMPERATOR = Comparator.comparing(Activity::getActivityOrder,
Comparator.nullsFirst(Integer::compareTo));
private static final int HEARTBEAT_INTERVAL = 30;
// Websocket will timeout after 60 seconds, pick a sensible max under this,
private static final int HEARTBEAT_INTERVAL_MAX = 50;
- private List<HubStatusListener> listeners = new CopyOnWriteArrayList<>();
+ private Set<HubStatusListener> listeners = ConcurrentHashMap.newKeySet();
private final HarmonyHubHandlerFactory factory;
private @NonNullByDefault({}) HarmonyHubConfig config;
private final HarmonyClient client;
@Override
public void initialize() {
config = getConfigAs(HarmonyHubConfig.class);
- cancelRetry();
updateStatus(ThingStatus.UNKNOWN);
scheduleRetry(0);
}
}
private void disconnectFromHub() {
- ScheduledFuture<?> localHeartBeatJob = heartBeatJob;
- if (localHeartBeatJob != null && !localHeartBeatJob.isDone()) {
- localHeartBeatJob.cancel(false);
+ ScheduledFuture<?> heartBeatJob = this.heartBeatJob;
+ if (heartBeatJob != null) {
+ heartBeatJob.cancel(true);
+ this.heartBeatJob = null;
}
client.disconnect();
}
private void setOfflineAndReconnect(String error) {
disconnectFromHub();
- scheduleRetry(RETRY_TIME);
updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, error);
+ scheduleRetry(RETRY_TIME);
}
private void cancelRetry() {
- ScheduledFuture<?> localRetryJob = retryJob;
- if (localRetryJob != null && !localRetryJob.isDone()) {
- localRetryJob.cancel(false);
+ ScheduledFuture<?> retryJob = this.retryJob;
+ if (retryJob != null) {
+ retryJob.cancel(true);
+ this.retryJob = null;
}
}
- private synchronized void scheduleRetry(int retrySeconds) {
+ private synchronized void scheduleRetry(int delaySeconds) {
cancelRetry();
- retryJob = scheduler.schedule(this::connect, retrySeconds, TimeUnit.SECONDS);
+ retryJob = scheduler.schedule(this::connect, delaySeconds, TimeUnit.SECONDS);
}
private void updateState(@Nullable Activity activity) {