diff --git a/bundles/org.openhab.binding.ecobee/src/main/java/org/openhab/binding/ecobee/internal/api/EcobeeApi.java b/bundles/org.openhab.binding.ecobee/src/main/java/org/openhab/binding/ecobee/internal/api/EcobeeApi.java index b245a4c83f90b..e2e6f6396350d 100644 --- a/bundles/org.openhab.binding.ecobee/src/main/java/org/openhab/binding/ecobee/internal/api/EcobeeApi.java +++ b/bundles/org.openhab.binding.ecobee/src/main/java/org/openhab/binding/ecobee/internal/api/EcobeeApi.java @@ -26,7 +26,6 @@ import java.util.Set; import java.util.concurrent.TimeoutException; -import org.apache.commons.lang3.exception.ExceptionUtils; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jetty.client.HttpClient; @@ -46,6 +45,7 @@ import org.openhab.binding.ecobee.internal.dto.thermostat.summary.SummaryResponseDTO; import org.openhab.binding.ecobee.internal.function.FunctionRequest; import org.openhab.binding.ecobee.internal.handler.EcobeeAccountBridgeHandler; +import org.openhab.binding.ecobee.internal.util.ExceptionUtils; import org.openhab.core.auth.client.oauth2.AccessTokenRefreshListener; import org.openhab.core.auth.client.oauth2.AccessTokenResponse; import org.openhab.core.auth.client.oauth2.OAuthClientService; @@ -315,7 +315,7 @@ private boolean executePost(String url, String json) { } private void logIOException(Exception e) { - Throwable rootCause = ExceptionUtils.getRootCause(e); + Throwable rootCause = ExceptionUtils.getRootThrowable(e); if (rootCause instanceof TimeoutException || rootCause instanceof EOFException) { // These are "normal" errors and should be logged as DEBUG logger.debug("API: Call to Ecobee API failed with exception: {}: {}", rootCause.getClass().getSimpleName(), diff --git a/bundles/org.openhab.binding.ecobee/src/main/java/org/openhab/binding/ecobee/internal/api/EcobeeAuth.java b/bundles/org.openhab.binding.ecobee/src/main/java/org/openhab/binding/ecobee/internal/api/EcobeeAuth.java index 06713ce002568..a974d2978b03a 100644 --- a/bundles/org.openhab.binding.ecobee/src/main/java/org/openhab/binding/ecobee/internal/api/EcobeeAuth.java +++ b/bundles/org.openhab.binding.ecobee/src/main/java/org/openhab/binding/ecobee/internal/api/EcobeeAuth.java @@ -18,7 +18,6 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import org.apache.commons.lang3.exception.ExceptionUtils; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jetty.client.HttpClient; @@ -29,6 +28,7 @@ import org.openhab.binding.ecobee.internal.dto.oauth.AuthorizeResponseDTO; import org.openhab.binding.ecobee.internal.dto.oauth.TokenResponseDTO; import org.openhab.binding.ecobee.internal.handler.EcobeeAccountBridgeHandler; +import org.openhab.binding.ecobee.internal.util.ExceptionUtils; import org.openhab.core.auth.client.oauth2.AccessTokenResponse; import org.openhab.core.auth.client.oauth2.OAuthClientService; import org.openhab.core.auth.client.oauth2.OAuthException; @@ -254,7 +254,7 @@ private boolean isPinExpired() { } catch (TimeoutException e) { logger.debug("TimeoutException: Call to Ecobee API timed out"); } catch (ExecutionException e) { - if (ExceptionUtils.getRootCause(e) instanceof HttpResponseException) { + if (ExceptionUtils.getRootThrowable(e) instanceof HttpResponseException) { logger.info("Awaiting entry of PIN in Ecobee portal. Expires in {} minutes", getMinutesUntilPinExpiration()); } else { diff --git a/bundles/org.openhab.binding.ecobee/src/main/java/org/openhab/binding/ecobee/internal/handler/EcobeeSensorThingHandler.java b/bundles/org.openhab.binding.ecobee/src/main/java/org/openhab/binding/ecobee/internal/handler/EcobeeSensorThingHandler.java index 5559b02ea2728..c3353276d1a55 100644 --- a/bundles/org.openhab.binding.ecobee/src/main/java/org/openhab/binding/ecobee/internal/handler/EcobeeSensorThingHandler.java +++ b/bundles/org.openhab.binding.ecobee/src/main/java/org/openhab/binding/ecobee/internal/handler/EcobeeSensorThingHandler.java @@ -17,11 +17,11 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import org.apache.commons.lang3.text.WordUtils; import org.eclipse.jdt.annotation.NonNullByDefault; import org.openhab.binding.ecobee.internal.config.EcobeeSensorConfiguration; import org.openhab.binding.ecobee.internal.dto.thermostat.RemoteSensorCapabilityDTO; import org.openhab.binding.ecobee.internal.dto.thermostat.RemoteSensorDTO; +import org.openhab.binding.ecobee.internal.util.StringUtils; import org.openhab.core.library.unit.Units; import org.openhab.core.thing.Channel; import org.openhab.core.thing.ChannelUID; @@ -126,7 +126,7 @@ private void updateCapabilityChannels(RemoteSensorCapabilityDTO capability) { ThingBuilder thingBuilder; thingBuilder = editThing(); channel = ChannelBuilder.create(uid, getAcceptedItemType(capability.type)) - .withLabel("Sensor " + WordUtils.capitalize(capability.type)) + .withLabel("Sensor " + StringUtils.capitalizeWords(capability.type)) .withType(getChannelTypeUID(capability.type)).build(); thingBuilder.withChannel(channel); updateThing(thingBuilder.build()); diff --git a/bundles/org.openhab.binding.ecobee/src/main/java/org/openhab/binding/ecobee/internal/handler/EcobeeThermostatBridgeHandler.java b/bundles/org.openhab.binding.ecobee/src/main/java/org/openhab/binding/ecobee/internal/handler/EcobeeThermostatBridgeHandler.java index 1f20011f3d5fa..20867209653c6 100644 --- a/bundles/org.openhab.binding.ecobee/src/main/java/org/openhab/binding/ecobee/internal/handler/EcobeeThermostatBridgeHandler.java +++ b/bundles/org.openhab.binding.ecobee/src/main/java/org/openhab/binding/ecobee/internal/handler/EcobeeThermostatBridgeHandler.java @@ -25,7 +25,6 @@ import javax.measure.Unit; -import org.apache.commons.lang3.text.WordUtils; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.ecobee.internal.action.EcobeeActions; @@ -50,6 +49,7 @@ import org.openhab.binding.ecobee.internal.dto.thermostat.WeatherForecastDTO; import org.openhab.binding.ecobee.internal.function.AbstractFunction; import org.openhab.binding.ecobee.internal.function.FunctionRequest; +import org.openhab.binding.ecobee.internal.util.StringUtils; import org.openhab.core.i18n.TimeZoneProvider; import org.openhab.core.library.types.DecimalType; import org.openhab.core.library.types.OnOffType; @@ -179,7 +179,7 @@ public SelectionDTO getSelection() { for (Channel channel : thing.getChannelsOfGroup(group)) { if (isLinked(channel.getUID())) { try { - Field field = selection.getClass().getField("include" + WordUtils.capitalize(group)); + Field field = selection.getClass().getField("include" + StringUtils.capitalizeWords(group)); logger.trace("ThermostatBridge: Thermostat thing '{}' including object '{}' in selection", thing.getUID(), field.getName()); field.set(selection, Boolean.TRUE); diff --git a/bundles/org.openhab.binding.ecobee/src/main/java/org/openhab/binding/ecobee/internal/util/ExceptionUtils.java b/bundles/org.openhab.binding.ecobee/src/main/java/org/openhab/binding/ecobee/internal/util/ExceptionUtils.java new file mode 100644 index 0000000000000..c4f7a3773b3b8 --- /dev/null +++ b/bundles/org.openhab.binding.ecobee/src/main/java/org/openhab/binding/ecobee/internal/util/ExceptionUtils.java @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2010-2023 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.binding.ecobee.internal.util; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; + +/** + * The {@link ExceptionUtils} class defines static Exception related methods + * + * @author Leo Siepel - Initial contribution + */ +@NonNullByDefault +public class ExceptionUtils { + + public static @Nullable Throwable getRootThrowable(@Nullable Throwable throwable) { + List list = new ArrayList<>(); + while (throwable != null && !list.contains(throwable)) { + list.add(throwable); + throwable = throwable.getCause(); + } + return throwable; + } +} diff --git a/bundles/org.openhab.binding.ecobee/src/main/java/org/openhab/binding/ecobee/internal/util/StringUtils.java b/bundles/org.openhab.binding.ecobee/src/main/java/org/openhab/binding/ecobee/internal/util/StringUtils.java new file mode 100644 index 0000000000000..10460da6167c1 --- /dev/null +++ b/bundles/org.openhab.binding.ecobee/src/main/java/org/openhab/binding/ecobee/internal/util/StringUtils.java @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2010-2023 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.binding.ecobee.internal.util; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; + +/** + * The {@link StringUtils} class defines static string related methods + * + * @author Leo Siepel - Initial contribution + */ +@NonNullByDefault +public class StringUtils { + + public static String capitalizeWords(@Nullable String input) { + String output = ""; + if (input != null) { + String[] splitted = input.split("\\s+"); + String[] processed = new String[splitted.length]; + for (int wordIndex = 0; wordIndex < splitted.length; wordIndex++) { + if (splitted[wordIndex].length() > 1) { + processed[wordIndex] = splitted[wordIndex].substring(0, 1).toUpperCase() + + splitted[wordIndex].substring(1); + } else { + processed[wordIndex] = splitted[wordIndex].toUpperCase(); + } + } + output = String.join(" ", processed); + } + return output; + } +}