[bindings d-e] Fix exception handling (Jetty HTTP client) (#10476)

Fixes #10474

Signed-off-by: Laurent Garnier <lg.hc@free.fr>
This commit is contained in:
lolodomo 2021-04-06 17:37:19 +02:00 committed by GitHub
parent fed460218e
commit 8ab37ce285
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 73 additions and 62 deletions

View File

@ -15,7 +15,9 @@ package org.openhab.binding.daikin.internal;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.NonNullByDefault;
@ -234,8 +236,11 @@ public class DaikinWebTargets {
return response.getContentAsString(); return response.getContentAsString();
} catch (DaikinCommunicationException e) { } catch (DaikinCommunicationException e) {
throw e; throw e;
} catch (Exception e) { } catch (ExecutionException | TimeoutException e) {
throw new DaikinCommunicationException("Daikin HTTP error", e); throw new DaikinCommunicationException("Daikin HTTP error", e);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new DaikinCommunicationException("Daikin HTTP interrupted", e);
} }
} }

View File

@ -28,7 +28,7 @@ import org.slf4j.LoggerFactory;
*/ */
@NonNullByDefault @NonNullByDefault
public class BasicInfo { public class BasicInfo {
private static final Logger logger = LoggerFactory.getLogger(BasicInfo.class); private static final Logger LOGGER = LoggerFactory.getLogger(BasicInfo.class);
public String mac = ""; public String mac = "";
public String ret = ""; public String ret = "";
@ -38,7 +38,7 @@ public class BasicInfo {
} }
public static BasicInfo parse(String response) { public static BasicInfo parse(String response) {
logger.debug("Parsing string: \"{}\"", response); LOGGER.debug("Parsing string: \"{}\"", response);
Map<String, String> responseMap = InfoParser.parse(response); Map<String, String> responseMap = InfoParser.parse(response);

View File

@ -36,7 +36,7 @@ public class EnergyInfoDayAndWeek {
public Optional<Double> energyCoolingThisWeek = Optional.empty(); public Optional<Double> energyCoolingThisWeek = Optional.empty();
public Optional<Double> energyCoolingLastWeek = Optional.empty(); public Optional<Double> energyCoolingLastWeek = Optional.empty();
private static final Logger logger = LoggerFactory.getLogger(EnergyInfoDayAndWeek.class); private static final Logger LOGGER = LoggerFactory.getLogger(EnergyInfoDayAndWeek.class);
private EnergyInfoDayAndWeek() { private EnergyInfoDayAndWeek() {
} }
@ -44,7 +44,7 @@ public class EnergyInfoDayAndWeek {
public static EnergyInfoDayAndWeek parse(String response) { public static EnergyInfoDayAndWeek parse(String response) {
EnergyInfoDayAndWeek info = new EnergyInfoDayAndWeek(); EnergyInfoDayAndWeek info = new EnergyInfoDayAndWeek();
logger.trace("Parsing string: \"{}\"", response); LOGGER.trace("Parsing string: \"{}\"", response);
// /aircon/get_week_power_ex // /aircon/get_week_power_ex
// ret=OK,s_dayw=0,week_heat=1/1/1/1/1/5/2/1/1/1/1/2/1/1,week_cool=0/0/0/0/0/0/0/0/0/0/0/0/0/0 // ret=OK,s_dayw=0,week_heat=1/1/1/1/1/5/2/1/1/1/1/2/1/1,week_cool=0/0/0/0/0/0/0/0/0/0/0/0/0/0
@ -94,7 +94,7 @@ public class EnergyInfoDayAndWeek {
info.energyCoolingLastWeek = Optional.of(previousWeekEnergy / 10); info.energyCoolingLastWeek = Optional.of(previousWeekEnergy / 10);
} }
} else { } else {
logger.debug("did not receive 'ret=OK' from adapter"); LOGGER.debug("did not receive 'ret=OK' from adapter");
} }
return info; return info;
} }

View File

@ -37,7 +37,6 @@ public class EnergyInfoYear {
} }
public static EnergyInfoYear parse(String response) { public static EnergyInfoYear parse(String response) {
LOGGER.trace("Parsing string: \"{}\"", response); LOGGER.trace("Parsing string: \"{}\"", response);
Map<String, String> responseMap = InfoParser.parse(response); Map<String, String> responseMap = InfoParser.parse(response);

View File

@ -29,7 +29,7 @@ import org.slf4j.LoggerFactory;
*/ */
@NonNullByDefault @NonNullByDefault
public class AirbaseBasicInfo { public class AirbaseBasicInfo {
private static final Logger logger = LoggerFactory.getLogger(AirbaseBasicInfo.class); private static final Logger LOGGER = LoggerFactory.getLogger(AirbaseBasicInfo.class);
public String mac = ""; public String mac = "";
public String ret = ""; public String ret = "";
@ -39,7 +39,7 @@ public class AirbaseBasicInfo {
} }
public static AirbaseBasicInfo parse(String response) { public static AirbaseBasicInfo parse(String response) {
logger.debug("Parsing string: \"{}\"", response); LOGGER.debug("Parsing string: \"{}\"", response);
Map<String, String> responseMap = InfoParser.parse(response); Map<String, String> responseMap = InfoParser.parse(response);

View File

@ -304,7 +304,7 @@ public class DaikinAcUnitHandler extends DaikinBaseHandler {
return; return;
} }
webTargets.registerUuid(key); webTargets.registerUuid(key);
} catch (Exception e) { } catch (DaikinCommunicationException e) {
// suppress exceptions // suppress exceptions
logger.debug("registerUuid({}) error: {}", key, e.getMessage()); logger.debug("registerUuid({}) error: {}", key, e.getMessage());
} }

View File

@ -14,6 +14,7 @@ package org.openhab.binding.darksky.internal.config;
import java.time.Duration; import java.time.Duration;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jdt.annotation.Nullable;
@ -85,11 +86,14 @@ public class DarkSkyChannelConfiguration {
throw new NumberFormatException(); throw new NumberFormatException();
} else { } else {
String[] splittedConfigTime = time.split(TIME_SEPARATOR); String[] splittedConfigTime = time.split(TIME_SEPARATOR);
if (splittedConfigTime.length < 2) {
throw new NumberFormatException();
}
int hour = Integer.parseInt(splittedConfigTime[0]); int hour = Integer.parseInt(splittedConfigTime[0]);
int minutes = Integer.parseInt(splittedConfigTime[1]); int minutes = Integer.parseInt(splittedConfigTime[1]);
return Duration.ofMinutes(minutes).plusHours(hour).toMinutes(); return Duration.ofMinutes(minutes).plusHours(hour).toMinutes();
} }
} catch (Exception ex) { } catch (PatternSyntaxException | NumberFormatException | ArithmeticException ex) {
logger.warn("Cannot parse channel configuration '{}' to hour and minutes, use pattern hh:mm, ignoring!", logger.warn("Cannot parse channel configuration '{}' to hour and minutes, use pattern hh:mm, ignoring!",
time); time);
} }

View File

@ -211,9 +211,13 @@ public class DarkSkyConnection {
} else { } else {
throw new DarkSkyCommunicationException(errorMessage, e.getCause()); throw new DarkSkyCommunicationException(errorMessage, e.getCause());
} }
} catch (InterruptedException | TimeoutException e) { } catch (TimeoutException e) {
logger.debug("Exception occurred during execution: {}", e.getLocalizedMessage(), e); logger.debug("Exception occurred during execution: {}", e.getLocalizedMessage(), e);
throw new DarkSkyCommunicationException(e.getLocalizedMessage(), e.getCause()); throw new DarkSkyCommunicationException(e.getLocalizedMessage(), e.getCause());
} catch (InterruptedException e) {
logger.debug("Execution interrupted: {}", e.getLocalizedMessage(), e);
Thread.currentThread().interrupt();
throw new DarkSkyCommunicationException(e.getLocalizedMessage(), e.getCause());
} }
} }

View File

@ -145,6 +145,7 @@ public class DenonMarantzTelnetClientThread extends Thread {
listener.telnetClientConnected(false); listener.telnetClientConnected(false);
} catch (InterruptedException e) { } catch (InterruptedException e) {
logger.debug("Interrupted while connecting to {}", config.getHost(), e); logger.debug("Interrupted while connecting to {}", config.getHost(), e);
Thread.currentThread().interrupt();
} }
delay = RECONNECT_DELAY; delay = RECONNECT_DELAY;
} }

View File

@ -127,6 +127,7 @@ public class DenonMarantzTelnetConnector extends DenonMarantzConnector implement
Thread.sleep(300); Thread.sleep(300);
} catch (InterruptedException e) { } catch (InterruptedException e) {
logger.trace("requestStateOverTelnet() - Interrupted while requesting state."); logger.trace("requestStateOverTelnet() - Interrupted while requesting state.");
Thread.currentThread().interrupt();
} }
} }
}); });

View File

@ -200,7 +200,7 @@ public class DenonMarantzHandler extends BaseThingHandler implements DenonMarant
* Try to auto configure the connection type (Telnet or HTTP) * Try to auto configure the connection type (Telnet or HTTP)
* for Things not added through Paper UI. * for Things not added through Paper UI.
*/ */
private void autoConfigure() { private void autoConfigure() throws InterruptedException {
/* /*
* The isTelnet parameter has no default. * The isTelnet parameter has no default.
* When not set we will try to auto-detect the correct values * When not set we will try to auto-detect the correct values
@ -223,7 +223,7 @@ public class DenonMarantzHandler extends BaseThingHandler implements DenonMarant
telnetEnable = false; telnetEnable = false;
httpApiUsable = true; httpApiUsable = true;
} }
} catch (InterruptedException | TimeoutException | ExecutionException e) { } catch (TimeoutException | ExecutionException e) {
logger.debug("Error when trying to access AVR using HTTP on port 80, reverting to Telnet mode.", e); logger.debug("Error when trying to access AVR using HTTP on port 80, reverting to Telnet mode.", e);
} }
@ -239,7 +239,7 @@ public class DenonMarantzHandler extends BaseThingHandler implements DenonMarant
httpPort = 8080; httpPort = 8080;
httpApiUsable = true; httpApiUsable = true;
} }
} catch (InterruptedException | TimeoutException | ExecutionException e) { } catch (TimeoutException | ExecutionException e) {
logger.debug("Additionally tried to connect to port 8080, this also failed", e); logger.debug("Additionally tried to connect to port 8080, this also failed", e);
} }
} }
@ -255,7 +255,7 @@ public class DenonMarantzHandler extends BaseThingHandler implements DenonMarant
response = httpClient.newRequest("http://" + host + ":" + httpPort + "/goform/Deviceinfo.xml") response = httpClient.newRequest("http://" + host + ":" + httpPort + "/goform/Deviceinfo.xml")
.timeout(3, TimeUnit.SECONDS).send(); .timeout(3, TimeUnit.SECONDS).send();
status = response.getStatus(); status = response.getStatus();
} catch (InterruptedException | TimeoutException | ExecutionException e) { } catch (TimeoutException | ExecutionException e) {
logger.debug("Failed in fetching the Deviceinfo.xml to determine zone count", e); logger.debug("Failed in fetching the Deviceinfo.xml to determine zone count", e);
} }
@ -303,7 +303,12 @@ public class DenonMarantzHandler extends BaseThingHandler implements DenonMarant
// Configure Connection type (Telnet/HTTP) and number of zones // Configure Connection type (Telnet/HTTP) and number of zones
// Note: this only happens for discovered Things // Note: this only happens for discovered Things
autoConfigure(); try {
autoConfigure();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
if (!checkConfiguration()) { if (!checkConfiguration()) {
return; return;

View File

@ -363,6 +363,9 @@ public abstract class DLinkHNAPCommunication {
} catch (final NoSuchAlgorithmException e) { } catch (final NoSuchAlgorithmException e) {
logger.debug("login - Internal error", e); logger.debug("login - Internal error", e);
status = HNAPStatus.INTERNAL_ERROR; status = HNAPStatus.INTERNAL_ERROR;
} catch (final InterruptedException e) {
status = HNAPStatus.COMMUNICATION_ERROR;
Thread.currentThread().interrupt();
} catch (final Exception e) { } catch (final Exception e) {
// Assume there has been some problem trying to send one of the messages // Assume there has been some problem trying to send one of the messages
if (status != HNAPStatus.COMMUNICATION_ERROR) { if (status != HNAPStatus.COMMUNICATION_ERROR) {

View File

@ -278,6 +278,9 @@ public class DLinkMotionSensorCommunication extends DLinkHNAPCommunication {
} else { } else {
unexpectedResult("getLastDetection - Unexpected response", soapResponse); unexpectedResult("getLastDetection - Unexpected response", soapResponse);
} }
} catch (final InterruptedException e) {
status = DeviceStatus.COMMUNICATION_ERROR;
Thread.currentThread().interrupt();
} catch (final Exception e) { } catch (final Exception e) {
// Assume there has been some problem trying to send one of the messages // Assume there has been some problem trying to send one of the messages
if (status != DeviceStatus.COMMUNICATION_ERROR) { if (status != DeviceStatus.COMMUNICATION_ERROR) {

View File

@ -47,6 +47,7 @@ Once logged in, select the **Developer** option from the menu.
If you don't see the **Developer** option on the menu, then something went wrong with the previous step. If you don't see the **Developer** option on the menu, then something went wrong with the previous step.
4. Finally, create a new application. 4. Finally, create a new application.
Give the application a name and fill in the application summary. Give the application a name and fill in the application summary.
Select the **Ecobee PIN** Authorization Method, then press **Create**. Select the **Ecobee PIN** Authorization Method, then press **Create**.
You now should see the **API key** for the application you just created. You now should see the **API key** for the application you just created.

View File

@ -262,6 +262,7 @@ public class EcobeeAuth {
} }
} catch (InterruptedException e) { } catch (InterruptedException e) {
logger.debug("InterruptedException on call to Ecobee authorization API: {}", e.getMessage()); logger.debug("InterruptedException on call to Ecobee authorization API: {}", e.getMessage());
Thread.currentThread().interrupt();
} }
return null; return null;
} }

View File

@ -160,9 +160,13 @@ public class EnturNoConnection {
String errorMessage = e.getLocalizedMessage(); String errorMessage = e.getLocalizedMessage();
logger.debug("Exception occurred during execution: {}", errorMessage, e); logger.debug("Exception occurred during execution: {}", errorMessage, e);
throw new EnturCommunicationException(errorMessage, e); throw new EnturCommunicationException(errorMessage, e);
} catch (InterruptedException | TimeoutException | IOException e) { } catch (TimeoutException | IOException e) {
logger.debug("Exception occurred during execution: {}", e.getLocalizedMessage(), e); logger.debug("Exception occurred during execution: {}", e.getLocalizedMessage(), e);
throw new EnturCommunicationException(e.getLocalizedMessage(), e); throw new EnturCommunicationException(e.getLocalizedMessage(), e);
} catch (InterruptedException e) {
logger.debug("Execution interrupted: {}", e.getLocalizedMessage(), e);
Thread.currentThread().interrupt();
throw new EnturCommunicationException(e.getLocalizedMessage(), e);
} }
} }

View File

@ -191,9 +191,13 @@ public class EtherRainCommunication {
logger.warn("Etherrain return status other than HTTP_OK : {}", response.getStatus()); logger.warn("Etherrain return status other than HTTP_OK : {}", response.getStatus());
return Collections.emptyList(); return Collections.emptyList();
} }
} catch (InterruptedException | TimeoutException | ExecutionException e) { } catch (TimeoutException | ExecutionException e) {
logger.warn("Could not connect to Etherrain with exception: {}", e.getMessage()); logger.warn("Could not connect to Etherrain with exception: {}", e.getMessage());
return Collections.emptyList(); return Collections.emptyList();
} catch (InterruptedException e) {
logger.warn("Connect to Etherrain interrupted: {}", e.getMessage());
Thread.currentThread().interrupt();
return Collections.emptyList();
} }
return new BufferedReader(new StringReader(response.getContentAsString())).lines().collect(Collectors.toList()); return new BufferedReader(new StringReader(response.getContentAsString())).lines().collect(Collectors.toList());

View File

@ -119,8 +119,11 @@ public class ApiAccess {
retVal = new Gson().fromJson(reply, outClass); retVal = new Gson().fromJson(reply, outClass);
} }
} }
} catch (InterruptedException | ExecutionException e) { } catch (ExecutionException e) {
logger.debug("Error in handling request: ", e); logger.debug("Error in handling request: ", e);
} catch (InterruptedException e) {
logger.debug("Handling request interrupted: ", e);
Thread.currentThread().interrupt();
} }
return retVal; return retVal;

View File

@ -48,7 +48,6 @@ public class EvohomeApiClient {
private static final String CLIENT_SECRET = "1a15cdb8-42de-407b-add0-059f92c530cb"; private static final String CLIENT_SECRET = "1a15cdb8-42de-407b-add0-059f92c530cb";
private final Logger logger = LoggerFactory.getLogger(EvohomeApiClient.class); private final Logger logger = LoggerFactory.getLogger(EvohomeApiClient.class);
private final HttpClient httpClient;
private final EvohomeAccountConfiguration configuration; private final EvohomeAccountConfiguration configuration;
private final ApiAccess apiAccess; private final ApiAccess apiAccess;
@ -60,19 +59,9 @@ public class EvohomeApiClient {
* Creates a new API client based on the V2 API interface * Creates a new API client based on the V2 API interface
* *
* @param configuration The configuration of the account to use * @param configuration The configuration of the account to use
* @throws Exception
*/ */
public EvohomeApiClient(EvohomeAccountConfiguration configuration, HttpClient httpClient) throws Exception { public EvohomeApiClient(EvohomeAccountConfiguration configuration, HttpClient httpClient) {
this.configuration = configuration; this.configuration = configuration;
this.httpClient = httpClient;
try {
httpClient.start();
} catch (Exception e) {
logger.error("Could not start http client", e);
throw new EvohomeApiClientException("Could not start http client", e);
}
apiAccess = new ApiAccess(httpClient); apiAccess = new ApiAccess(httpClient);
apiAccess.setApplicationId(APPLICATION_ID); apiAccess.setApplicationId(APPLICATION_ID);
} }
@ -85,14 +74,6 @@ public class EvohomeApiClient {
useraccount = null; useraccount = null;
locations = null; locations = null;
locationsStatus = null; locationsStatus = null;
if (httpClient.isStarted()) {
try {
httpClient.stop();
} catch (Exception e) {
logger.debug("Could not stop http client.", e);
}
}
} }
public boolean login() { public boolean login() {

View File

@ -74,30 +74,22 @@ public class EvohomeAccountBridgeHandler extends BaseBridgeHandler {
configuration = getConfigAs(EvohomeAccountConfiguration.class); configuration = getConfigAs(EvohomeAccountConfiguration.class);
if (checkConfig()) { if (checkConfig()) {
try { apiClient = new EvohomeApiClient(configuration, this.httpClient);
apiClient = new EvohomeApiClient(configuration, this.httpClient);
} catch (Exception e) {
logger.error("Could not start API client", e);
updateAccountStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"Could not create evohome API client");
}
if (apiClient != null) { // Initialization can take a while, so kick it off on a separate thread
// Initialization can take a while, so kick it off on a separate thread scheduler.schedule(() -> {
scheduler.schedule(() -> { if (apiClient.login()) {
if (apiClient.login()) { if (checkInstallationInfoHasDuplicateIds(apiClient.getInstallationInfo())) {
if (checkInstallationInfoHasDuplicateIds(apiClient.getInstallationInfo())) { startRefreshTask();
startRefreshTask();
} else {
updateAccountStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"System Information Sanity Check failed");
}
} else { } else {
updateAccountStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, updateAccountStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"Authentication failed"); "System Information Sanity Check failed");
} }
}, 0, TimeUnit.SECONDS); } else {
} updateAccountStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"Authentication failed");
}
}, 0, TimeUnit.SECONDS);
} }
} }