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;
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;
}
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(),
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;
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;
} 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 {
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;
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());
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;
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;
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);
--- /dev/null
+/**
+ * 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<Throwable> list = new ArrayList<>();
+ while (throwable != null && !list.contains(throwable)) {
+ list.add(throwable);
+ throwable = throwable.getCause();
+ }
+ return throwable;
+ }
+}
--- /dev/null
+/**
+ * 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;
+ }
+}