[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.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.stream.Collectors;
import org.eclipse.jdt.annotation.NonNullByDefault;
@ -234,8 +236,11 @@ public class DaikinWebTargets {
return response.getContentAsString();
} catch (DaikinCommunicationException e) {
throw e;
} catch (Exception e) {
} catch (ExecutionException | TimeoutException 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
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 ret = "";
@ -38,7 +38,7 @@ public class BasicInfo {
}
public static BasicInfo parse(String response) {
logger.debug("Parsing string: \"{}\"", response);
LOGGER.debug("Parsing string: \"{}\"", 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> energyCoolingLastWeek = Optional.empty();
private static final Logger logger = LoggerFactory.getLogger(EnergyInfoDayAndWeek.class);
private static final Logger LOGGER = LoggerFactory.getLogger(EnergyInfoDayAndWeek.class);
private EnergyInfoDayAndWeek() {
}
@ -44,7 +44,7 @@ public class EnergyInfoDayAndWeek {
public static EnergyInfoDayAndWeek parse(String response) {
EnergyInfoDayAndWeek info = new EnergyInfoDayAndWeek();
logger.trace("Parsing string: \"{}\"", response);
LOGGER.trace("Parsing string: \"{}\"", response);
// /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
@ -94,7 +94,7 @@ public class EnergyInfoDayAndWeek {
info.energyCoolingLastWeek = Optional.of(previousWeekEnergy / 10);
}
} else {
logger.debug("did not receive 'ret=OK' from adapter");
LOGGER.debug("did not receive 'ret=OK' from adapter");
}
return info;
}

View File

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

View File

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

View File

@ -304,7 +304,7 @@ public class DaikinAcUnitHandler extends DaikinBaseHandler {
return;
}
webTargets.registerUuid(key);
} catch (Exception e) {
} catch (DaikinCommunicationException e) {
// suppress exceptions
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.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
@ -85,11 +86,14 @@ public class DarkSkyChannelConfiguration {
throw new NumberFormatException();
} else {
String[] splittedConfigTime = time.split(TIME_SEPARATOR);
if (splittedConfigTime.length < 2) {
throw new NumberFormatException();
}
int hour = Integer.parseInt(splittedConfigTime[0]);
int minutes = Integer.parseInt(splittedConfigTime[1]);
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!",
time);
}

View File

@ -211,9 +211,13 @@ public class DarkSkyConnection {
} else {
throw new DarkSkyCommunicationException(errorMessage, e.getCause());
}
} catch (InterruptedException | TimeoutException e) {
} catch (TimeoutException e) {
logger.debug("Exception occurred during execution: {}", e.getLocalizedMessage(), e);
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);
} catch (InterruptedException e) {
logger.debug("Interrupted while connecting to {}", config.getHost(), e);
Thread.currentThread().interrupt();
}
delay = RECONNECT_DELAY;
}

View File

@ -127,6 +127,7 @@ public class DenonMarantzTelnetConnector extends DenonMarantzConnector implement
Thread.sleep(300);
} catch (InterruptedException e) {
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)
* for Things not added through Paper UI.
*/
private void autoConfigure() {
private void autoConfigure() throws InterruptedException {
/*
* The isTelnet parameter has no default.
* 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;
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);
}
@ -239,7 +239,7 @@ public class DenonMarantzHandler extends BaseThingHandler implements DenonMarant
httpPort = 8080;
httpApiUsable = true;
}
} catch (InterruptedException | TimeoutException | ExecutionException e) {
} catch (TimeoutException | ExecutionException 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")
.timeout(3, TimeUnit.SECONDS).send();
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);
}
@ -303,7 +303,12 @@ public class DenonMarantzHandler extends BaseThingHandler implements DenonMarant
// Configure Connection type (Telnet/HTTP) and number of zones
// Note: this only happens for discovered Things
autoConfigure();
try {
autoConfigure();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
if (!checkConfiguration()) {
return;

View File

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

View File

@ -278,6 +278,9 @@ public class DLinkMotionSensorCommunication extends DLinkHNAPCommunication {
} else {
unexpectedResult("getLastDetection - Unexpected response", soapResponse);
}
} catch (final InterruptedException e) {
status = DeviceStatus.COMMUNICATION_ERROR;
Thread.currentThread().interrupt();
} catch (final Exception e) {
// Assume there has been some problem trying to send one of the messages
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.
4. Finally, create a new application.
Give the application a name and fill in the application summary.
Select the **Ecobee PIN** Authorization Method, then press **Create**.
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) {
logger.debug("InterruptedException on call to Ecobee authorization API: {}", e.getMessage());
Thread.currentThread().interrupt();
}
return null;
}

View File

@ -160,9 +160,13 @@ public class EnturNoConnection {
String errorMessage = e.getLocalizedMessage();
logger.debug("Exception occurred during execution: {}", 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);
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());
return Collections.emptyList();
}
} catch (InterruptedException | TimeoutException | ExecutionException e) {
} catch (TimeoutException | ExecutionException e) {
logger.warn("Could not connect to Etherrain with exception: {}", e.getMessage());
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());

View File

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

View File

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

View File

@ -74,30 +74,22 @@ public class EvohomeAccountBridgeHandler extends BaseBridgeHandler {
configuration = getConfigAs(EvohomeAccountConfiguration.class);
if (checkConfig()) {
try {
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");
}
apiClient = new EvohomeApiClient(configuration, this.httpClient);
if (apiClient != null) {
// Initialization can take a while, so kick it off on a separate thread
scheduler.schedule(() -> {
if (apiClient.login()) {
if (checkInstallationInfoHasDuplicateIds(apiClient.getInstallationInfo())) {
startRefreshTask();
} else {
updateAccountStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR,
"System Information Sanity Check failed");
}
// Initialization can take a while, so kick it off on a separate thread
scheduler.schedule(() -> {
if (apiClient.login()) {
if (checkInstallationInfoHasDuplicateIds(apiClient.getInstallationInfo())) {
startRefreshTask();
} else {
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);
}
}