Skip to content

Commit 600ca69

Browse files
committed
[melcloud] Improve null handling (openhab#17295)
* Add null annotations Signed-off-by: Leo Siepel <[email protected]>
1 parent d5ad854 commit 600ca69

25 files changed

+154
-128
lines changed

bundles/org.openhab.binding.melcloud/src/main/java/org/openhab/binding/melcloud/internal/MelCloudBindingConstants.java

+2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import java.util.stream.Collectors;
1818
import java.util.stream.Stream;
1919

20+
import org.eclipse.jdt.annotation.NonNullByDefault;
2021
import org.openhab.core.thing.ThingTypeUID;
2122

2223
/**
@@ -26,6 +27,7 @@
2627
* @author Luca Calcaterra - Initial contribution
2728
* @author Wietse van Buitenen - Added heatpump device
2829
*/
30+
@NonNullByDefault
2931
public class MelCloudBindingConstants {
3032

3133
private static final String BINDING_ID = "melcloud";

bundles/org.openhab.binding.melcloud/src/main/java/org/openhab/binding/melcloud/internal/MelCloudHandlerFactory.java

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import static org.openhab.binding.melcloud.internal.MelCloudBindingConstants.*;
1616

17+
import org.eclipse.jdt.annotation.NonNullByDefault;
1718
import org.eclipse.jdt.annotation.Nullable;
1819
import org.openhab.binding.melcloud.internal.handler.MelCloudAccountHandler;
1920
import org.openhab.binding.melcloud.internal.handler.MelCloudDeviceHandler;
@@ -33,6 +34,7 @@
3334
* @author Luca Calcaterra - Initial contribution
3435
* @author Wietse van Buitenen - Added heatpump device
3536
*/
37+
@NonNullByDefault
3638
@Component(configurationPid = "binding.melcloud", service = ThingHandlerFactory.class)
3739
public class MelCloudHandlerFactory extends BaseThingHandlerFactory {
3840

bundles/org.openhab.binding.melcloud/src/main/java/org/openhab/binding/melcloud/internal/api/MelCloudConnection.java

+19-16
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,15 @@
1919
import java.util.ArrayList;
2020
import java.util.Arrays;
2121
import java.util.List;
22+
import java.util.Objects;
2223
import java.util.Properties;
2324

24-
import org.openhab.binding.melcloud.internal.api.json.Device;
25-
import org.openhab.binding.melcloud.internal.api.json.DeviceStatus;
26-
import org.openhab.binding.melcloud.internal.api.json.HeatpumpDeviceStatus;
27-
import org.openhab.binding.melcloud.internal.api.json.ListDevicesResponse;
28-
import org.openhab.binding.melcloud.internal.api.json.LoginClientResponse;
25+
import org.eclipse.jdt.annotation.NonNullByDefault;
26+
import org.openhab.binding.melcloud.internal.api.dto.Device;
27+
import org.openhab.binding.melcloud.internal.api.dto.DeviceStatus;
28+
import org.openhab.binding.melcloud.internal.api.dto.HeatpumpDeviceStatus;
29+
import org.openhab.binding.melcloud.internal.api.dto.ListDevicesResponse;
30+
import org.openhab.binding.melcloud.internal.api.dto.LoginClientResponse;
2931
import org.openhab.binding.melcloud.internal.exceptions.MelCloudCommException;
3032
import org.openhab.binding.melcloud.internal.exceptions.MelCloudLoginException;
3133
import org.openhab.core.io.net.http.HttpUtil;
@@ -45,6 +47,7 @@
4547
* @author Pauli Anttila - Refactoring
4648
* @author Wietse van Buitenen - Return all devices, added heatpump device
4749
*/
50+
@NonNullByDefault
4851
public class MelCloudConnection {
4952

5053
private static final String LOGIN_URL = "https://app.melcloud.com/Mitsubishi.Wifi.Client/Login/ClientLogin";
@@ -54,18 +57,18 @@ public class MelCloudConnection {
5457
private static final int TIMEOUT_MILLISECONDS = 10000;
5558

5659
// Gson objects are safe to share across threads and are somewhat expensive to construct. Use a single instance.
57-
private static final Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation()
60+
private static final Gson GSON = new GsonBuilder().excludeFieldsWithoutExposeAnnotation()
5861
.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create();
5962

6063
private final Logger logger = LoggerFactory.getLogger(MelCloudConnection.class);
6164

6265
private boolean isConnected = false;
63-
private String sessionKey;
66+
private String sessionKey = "";
6467

6568
public void login(String username, String password, int languageId)
6669
throws MelCloudCommException, MelCloudLoginException {
6770
setConnected(false);
68-
sessionKey = null;
71+
sessionKey = "";
6972
JsonObject jsonReq = new JsonObject();
7073
jsonReq.addProperty("Email", username);
7174
jsonReq.addProperty("Password", password);
@@ -79,7 +82,7 @@ public void login(String username, String password, int languageId)
7982
String loginResponse = HttpUtil.executeUrl("POST", LOGIN_URL, null, data, "application/json",
8083
TIMEOUT_MILLISECONDS);
8184
logger.debug("Login response: {}", loginResponse);
82-
LoginClientResponse resp = gson.fromJson(loginResponse, LoginClientResponse.class);
85+
LoginClientResponse resp = Objects.requireNonNull(GSON.fromJson(loginResponse, LoginClientResponse.class));
8386
if (resp.getErrorId() != null) {
8487
String errorMsg = String.format("Login failed, error code: %s", resp.getErrorId());
8588
if (resp.getErrorMessage() != null) {
@@ -101,7 +104,7 @@ public List<Device> fetchDeviceList() throws MelCloudCommException {
101104
TIMEOUT_MILLISECONDS);
102105
logger.debug("Device list response: {}", response);
103106
List<Device> devices = new ArrayList<>();
104-
ListDevicesResponse[] buildings = gson.fromJson(response, ListDevicesResponse[].class);
107+
ListDevicesResponse[] buildings = GSON.fromJson(response, ListDevicesResponse[].class);
105108
Arrays.asList(buildings).forEach(building -> {
106109
if (building.getStructure().getDevices() != null) {
107110
devices.addAll(building.getStructure().getDevices());
@@ -137,7 +140,7 @@ public DeviceStatus fetchDeviceStatus(int deviceId, int buildingId) throws MelCl
137140
try {
138141
String response = HttpUtil.executeUrl("GET", url, getHeaderProperties(), null, null, TIMEOUT_MILLISECONDS);
139142
logger.debug("Device status response: {}", response);
140-
return gson.fromJson(response, DeviceStatus.class);
143+
return Objects.requireNonNull(GSON.fromJson(response, DeviceStatus.class));
141144
} catch (IOException | JsonSyntaxException e) {
142145
setConnected(false);
143146
throw new MelCloudCommException("Error occurred during device status fetch", e);
@@ -146,14 +149,14 @@ public DeviceStatus fetchDeviceStatus(int deviceId, int buildingId) throws MelCl
146149

147150
public DeviceStatus sendDeviceStatus(DeviceStatus deviceStatus) throws MelCloudCommException {
148151
assertConnected();
149-
String content = gson.toJson(deviceStatus, DeviceStatus.class);
152+
String content = GSON.toJson(deviceStatus, DeviceStatus.class);
150153
logger.debug("Sending device status: {}", content);
151154
InputStream data = new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8));
152155
try {
153156
String response = HttpUtil.executeUrl("POST", DEVICE_URL + "/SetAta", getHeaderProperties(), data,
154157
"application/json", TIMEOUT_MILLISECONDS);
155158
logger.debug("Device status sending response: {}", response);
156-
return gson.fromJson(response, DeviceStatus.class);
159+
return Objects.requireNonNull(GSON.fromJson(response, DeviceStatus.class));
157160
} catch (IOException | JsonSyntaxException e) {
158161
setConnected(false);
159162
throw new MelCloudCommException("Error occurred during device command sending", e);
@@ -166,7 +169,7 @@ public HeatpumpDeviceStatus fetchHeatpumpDeviceStatus(int deviceId, int building
166169
try {
167170
String response = HttpUtil.executeUrl("GET", url, getHeaderProperties(), null, null, TIMEOUT_MILLISECONDS);
168171
logger.debug("Device heatpump status response: {}", response);
169-
return gson.fromJson(response, HeatpumpDeviceStatus.class);
172+
return Objects.requireNonNull(GSON.fromJson(response, HeatpumpDeviceStatus.class));
170173
} catch (IOException | JsonSyntaxException e) {
171174
setConnected(false);
172175
throw new MelCloudCommException("Error occurred during heatpump device status fetch", e);
@@ -176,14 +179,14 @@ public HeatpumpDeviceStatus fetchHeatpumpDeviceStatus(int deviceId, int building
176179
public HeatpumpDeviceStatus sendHeatpumpDeviceStatus(HeatpumpDeviceStatus heatpumpDeviceStatus)
177180
throws MelCloudCommException {
178181
assertConnected();
179-
String content = gson.toJson(heatpumpDeviceStatus, HeatpumpDeviceStatus.class);
182+
String content = GSON.toJson(heatpumpDeviceStatus, HeatpumpDeviceStatus.class);
180183
logger.debug("Sending heatpump device status: {}", content);
181184
InputStream data = new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8));
182185
try {
183186
String response = HttpUtil.executeUrl("POST", DEVICE_URL + "/SetAtw", getHeaderProperties(), data,
184187
"application/json", TIMEOUT_MILLISECONDS);
185188
logger.debug("Device heatpump status sending response: {}", response);
186-
return gson.fromJson(response, HeatpumpDeviceStatus.class);
189+
return Objects.requireNonNull(GSON.fromJson(response, HeatpumpDeviceStatus.class));
187190
} catch (IOException | JsonSyntaxException e) {
188191
setConnected(false);
189192
throw new MelCloudCommException("Error occurred during heatpump device command sending", e);

bundles/org.openhab.binding.melcloud/src/main/java/org/openhab/binding/melcloud/internal/api/json/Area.java bundles/org.openhab.binding.melcloud/src/main/java/org/openhab/binding/melcloud/internal/api/dto/Area.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
* SPDX-License-Identifier: EPL-2.0
1212
*/
13-
package org.openhab.binding.melcloud.internal.api.json;
13+
package org.openhab.binding.melcloud.internal.api.dto;
1414

1515
import java.util.List;
1616

bundles/org.openhab.binding.melcloud/src/main/java/org/openhab/binding/melcloud/internal/api/json/Device.java bundles/org.openhab.binding.melcloud/src/main/java/org/openhab/binding/melcloud/internal/api/dto/Device.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
* SPDX-License-Identifier: EPL-2.0
1212
*/
13-
package org.openhab.binding.melcloud.internal.api.json;
13+
package org.openhab.binding.melcloud.internal.api.dto;
1414

1515
import java.security.Permissions;
1616
import java.util.List;

bundles/org.openhab.binding.melcloud/src/main/java/org/openhab/binding/melcloud/internal/api/json/DeviceProps.java bundles/org.openhab.binding.melcloud/src/main/java/org/openhab/binding/melcloud/internal/api/dto/DeviceProps.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
* SPDX-License-Identifier: EPL-2.0
1212
*/
13-
package org.openhab.binding.melcloud.internal.api.json;
13+
package org.openhab.binding.melcloud.internal.api.dto;
1414

1515
import java.util.List;
1616

bundles/org.openhab.binding.melcloud/src/main/java/org/openhab/binding/melcloud/internal/api/json/DeviceStatus.java bundles/org.openhab.binding.melcloud/src/main/java/org/openhab/binding/melcloud/internal/api/dto/DeviceStatus.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
* SPDX-License-Identifier: EPL-2.0
1212
*/
13-
package org.openhab.binding.melcloud.internal.api.json;
13+
package org.openhab.binding.melcloud.internal.api.dto;
1414

1515
import java.util.List;
1616

bundles/org.openhab.binding.melcloud/src/main/java/org/openhab/binding/melcloud/internal/api/json/Floor.java bundles/org.openhab.binding.melcloud/src/main/java/org/openhab/binding/melcloud/internal/api/dto/Floor.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
* SPDX-License-Identifier: EPL-2.0
1212
*/
13-
package org.openhab.binding.melcloud.internal.api.json;
13+
package org.openhab.binding.melcloud.internal.api.dto;
1414

1515
import java.util.List;
1616

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
* SPDX-License-Identifier: EPL-2.0
1212
*/
13-
package org.openhab.binding.melcloud.internal.api.json;
13+
package org.openhab.binding.melcloud.internal.api.dto;
1414

1515
import java.util.List;
1616

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
* SPDX-License-Identifier: EPL-2.0
1212
*/
13-
package org.openhab.binding.melcloud.internal.api.json;
13+
package org.openhab.binding.melcloud.internal.api.dto;
1414

1515
import com.google.gson.annotations.Expose;
1616
import com.google.gson.annotations.SerializedName;
+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
* SPDX-License-Identifier: EPL-2.0
1212
*/
13-
package org.openhab.binding.melcloud.internal.api.json;
13+
package org.openhab.binding.melcloud.internal.api.dto;
1414

1515
import java.util.List;
1616

bundles/org.openhab.binding.melcloud/src/main/java/org/openhab/binding/melcloud/internal/api/json/LoginData.java bundles/org.openhab.binding.melcloud/src/main/java/org/openhab/binding/melcloud/internal/api/dto/LoginData.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
* SPDX-License-Identifier: EPL-2.0
1212
*/
13-
package org.openhab.binding.melcloud.internal.api.json;
13+
package org.openhab.binding.melcloud.internal.api.dto;
1414

1515
import com.google.gson.annotations.Expose;
1616

bundles/org.openhab.binding.melcloud/src/main/java/org/openhab/binding/melcloud/internal/api/json/Preset.java bundles/org.openhab.binding.melcloud/src/main/java/org/openhab/binding/melcloud/internal/api/dto/Preset.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
* SPDX-License-Identifier: EPL-2.0
1212
*/
13-
package org.openhab.binding.melcloud.internal.api.json;
13+
package org.openhab.binding.melcloud.internal.api.dto;
1414

1515
import com.google.gson.annotations.Expose;
1616

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
* SPDX-License-Identifier: EPL-2.0
1212
*/
13-
package org.openhab.binding.melcloud.internal.api.json;
13+
package org.openhab.binding.melcloud.internal.api.dto;
1414

1515
import com.google.gson.annotations.Expose;
1616

bundles/org.openhab.binding.melcloud/src/main/java/org/openhab/binding/melcloud/internal/api/json/Structure.java bundles/org.openhab.binding.melcloud/src/main/java/org/openhab/binding/melcloud/internal/api/dto/Structure.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
* SPDX-License-Identifier: EPL-2.0
1212
*/
13-
package org.openhab.binding.melcloud.internal.api.json;
13+
package org.openhab.binding.melcloud.internal.api.dto;
1414

1515
import java.util.List;
1616

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
* SPDX-License-Identifier: EPL-2.0
1212
*/
13-
package org.openhab.binding.melcloud.internal.api.json;
13+
package org.openhab.binding.melcloud.internal.api.dto;
1414

1515
import com.google.gson.annotations.Expose;
1616

bundles/org.openhab.binding.melcloud/src/main/java/org/openhab/binding/melcloud/internal/config/AcDeviceConfig.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,21 @@
1212
*/
1313
package org.openhab.binding.melcloud.internal.config;
1414

15+
import org.eclipse.jdt.annotation.NonNullByDefault;
16+
import org.eclipse.jdt.annotation.Nullable;
17+
1518
/**
1619
* Config class for an A.C. device.
1720
*
1821
* @author Pauli Anttila - Initial Contribution
1922
*
2023
*/
24+
@NonNullByDefault
2125
public class AcDeviceConfig {
2226

23-
public Integer deviceID;
24-
public Integer buildingID;
25-
public Integer pollingInterval;
27+
public Integer deviceID = 0;
28+
public @Nullable Integer buildingID;
29+
public Integer pollingInterval = 360;
2630

2731
@Override
2832
public String toString() {

bundles/org.openhab.binding.melcloud/src/main/java/org/openhab/binding/melcloud/internal/config/AccountConfig.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,27 @@
1212
*/
1313
package org.openhab.binding.melcloud.internal.config;
1414

15+
import org.eclipse.jdt.annotation.NonNullByDefault;
16+
1517
/**
1618
* Config class for MELCloud account parameters.
1719
*
1820
* @author Pauli Anttila - Initial Contribution
1921
*
2022
*/
23+
@NonNullByDefault
2124
public class AccountConfig {
2225

23-
public String username;
24-
public String password;
25-
public int language;
26+
public String username = "";
27+
public String password = "";
28+
public int language = 0;
2629

2730
@Override
2831
public String toString() {
2932
return "[username=" + username + ", password=" + getPasswordForPrinting() + ", languageId=" + language + "]";
3033
}
3134

3235
private String getPasswordForPrinting() {
33-
if (password != null) {
34-
return password.isEmpty() ? "<empty>" : "*********";
35-
}
36-
return "<null>";
36+
return password.isEmpty() ? "<empty>" : "*********";
3737
}
3838
}

bundles/org.openhab.binding.melcloud/src/main/java/org/openhab/binding/melcloud/internal/config/HeatpumpDeviceConfig.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,20 @@
1212
*/
1313
package org.openhab.binding.melcloud.internal.config;
1414

15+
import org.eclipse.jdt.annotation.NonNullByDefault;
16+
import org.eclipse.jdt.annotation.Nullable;
17+
1518
/**
1619
* Config class for a Heatpump device.
1720
*
1821
* @author Wietse van Buitenen - Initial Contribution
1922
*
2023
*/
24+
@NonNullByDefault
2125
public class HeatpumpDeviceConfig {
22-
public Integer deviceID;
23-
public Integer buildingID;
24-
public Integer pollingInterval;
26+
public Integer deviceID = 0;
27+
public @Nullable Integer buildingID;
28+
public Integer pollingInterval = 360;
2529

2630
@Override
2731
public String toString() {

0 commit comments

Comments
 (0)