From de0d4fab0139323daf498cbec442a478b9871e50 Mon Sep 17 00:00:00 2001 From: Cody Cutrer Date: Tue, 11 Oct 2022 15:19:58 -0600 Subject: [PATCH 1/4] avoid null pointer error if a characteristic goes missing like if a characteristic has been removed, but the iOS device hasn't updated its db yet, and tries to set it --- .../server/impl/json/CharacteristicsController.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/github/hapjava/server/impl/json/CharacteristicsController.java b/src/main/java/io/github/hapjava/server/impl/json/CharacteristicsController.java index 4d20a0c6b..d061a11fc 100644 --- a/src/main/java/io/github/hapjava/server/impl/json/CharacteristicsController.java +++ b/src/main/java/io/github/hapjava/server/impl/json/CharacteristicsController.java @@ -51,7 +51,7 @@ public HttpResponse get(HttpRequest request) throws Exception { characteristics.add(characteristic.add("aid", aid).add("iid", iid).build()); } else { logger.warn( - "Accessory " + aid + " does not have characteristic " + iid + "Request: " + uri); + "Accessory " + aid + " does not have characteristic " + iid + ". Request: " + uri); } } else { logger.warn( @@ -77,7 +77,16 @@ public HttpResponse put(HttpRequest request, HomekitClientConnection connection) JsonObject jsonCharacteristic = (JsonObject) value; int aid = jsonCharacteristic.getInt("aid"); int iid = jsonCharacteristic.getInt("iid"); - Characteristic characteristic = registry.getCharacteristics(aid).get(iid); + Map accessory = registry.getCharacteristics(aid); + if (accessory.isEmpty()) { + logger.warn("Accessory {} has no characteristics or does not exist.", aid); + return new HapJsonNoContentResponse(); + } + Characteristic characteristic = accessory.get(iid); + if (characteristic == null) { + logger.warn("Accessory {} does not have characteristic {}.", aid, iid); + return new HapJsonNoContentResponse(); + } if (jsonCharacteristic.containsKey("value")) { characteristic.setValue(jsonCharacteristic.get("value")); From 7d5f01eb99d3c2fb72a4db622bad40647e3f4c53 Mon Sep 17 00:00:00 2001 From: Cody Cutrer Date: Tue, 11 Oct 2022 15:21:56 -0600 Subject: [PATCH 2/4] color temperature is in mireds, not Kelvin --- .../impl/lightbulb/ColorTemperatureCharacteristic.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/ColorTemperatureCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/ColorTemperatureCharacteristic.java index 12886c7a1..987ab5eee 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/ColorTemperatureCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/lightbulb/ColorTemperatureCharacteristic.java @@ -9,7 +9,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -/** This characteristic describes color temperature in Kelvin */ +/** This characteristic describes color temperature in mireds */ public class ColorTemperatureCharacteristic extends IntegerCharacteristic implements EventableCharacteristic { public static final int DEFAULT_MIN_VALUE = 50; @@ -27,7 +27,7 @@ public ColorTemperatureCharacteristic( "color temperature", minValue, maxValue, - "K", + "mired", Optional.of(getter), Optional.of(setter), Optional.of(subscriber), From 64972c8bf860a9d200c3b26a4f530cb10c160ced Mon Sep 17 00:00:00 2001 From: Cody Cutrer Date: Tue, 11 Oct 2022 15:22:09 -0600 Subject: [PATCH 3/4] make BaseCharacteristic.getDefault public --- .../hapjava/characteristics/impl/base/BaseCharacteristic.java | 2 +- .../characteristics/impl/base/BooleanCharacteristic.java | 2 +- .../hapjava/characteristics/impl/base/EnumCharacteristic.java | 2 +- .../hapjava/characteristics/impl/base/FloatCharacteristic.java | 2 +- .../characteristics/impl/base/IntegerCharacteristic.java | 2 +- .../characteristics/impl/base/StaticStringCharacteristic.java | 2 +- .../hapjava/characteristics/impl/base/StringCharacteristic.java | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/io/github/hapjava/characteristics/impl/base/BaseCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/BaseCharacteristic.java index a90f1fadc..a0a302c29 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/base/BaseCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/BaseCharacteristic.java @@ -181,7 +181,7 @@ public void unsubscribe() { * * @return a sensible default value. */ - protected abstract T getDefault(); + public abstract T getDefault(); /** * Writes the value key to the serialized characteristic diff --git a/src/main/java/io/github/hapjava/characteristics/impl/base/BooleanCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/BooleanCharacteristic.java index 83d7f765a..3e07936a8 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/base/BooleanCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/BooleanCharacteristic.java @@ -71,7 +71,7 @@ protected void setValue(Boolean value) throws Exception { /** {@inheritDoc} */ @Override - protected Boolean getDefault() { + public Boolean getDefault() { return false; } } diff --git a/src/main/java/io/github/hapjava/characteristics/impl/base/EnumCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/EnumCharacteristic.java index f983efe16..df3287de5 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/base/EnumCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/EnumCharacteristic.java @@ -111,7 +111,7 @@ protected void setValue(Integer value) throws Exception { /** {@inheritDoc} */ @Override - protected Integer getDefault() { + public Integer getDefault() { // as default return first item from valid values if (validValues != null && validValues.length > 0) { return validValues[0].getCode(); diff --git a/src/main/java/io/github/hapjava/characteristics/impl/base/FloatCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/FloatCharacteristic.java index e15da4fde..3781cc14d 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/base/FloatCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/FloatCharacteristic.java @@ -135,7 +135,7 @@ protected void setValue(Double value) throws Exception { /** {@inheritDoc} */ @Override - protected Double getDefault() { + public Double getDefault() { return minValue; } } diff --git a/src/main/java/io/github/hapjava/characteristics/impl/base/IntegerCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/IntegerCharacteristic.java index fcd804ccd..3ea8d87bc 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/base/IntegerCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/IntegerCharacteristic.java @@ -82,7 +82,7 @@ protected void setValue(Integer value) throws Exception { /** {@inheritDoc} */ @Override - protected Integer getDefault() { + public Integer getDefault() { return minValue; } diff --git a/src/main/java/io/github/hapjava/characteristics/impl/base/StaticStringCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/StaticStringCharacteristic.java index d5de2f9ce..ec851bbf7 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/base/StaticStringCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/StaticStringCharacteristic.java @@ -65,7 +65,7 @@ protected CompletableFuture getValue() { /** {@inheritDoc} */ @Override - protected String getDefault() { + public String getDefault() { return "Unknown"; } } diff --git a/src/main/java/io/github/hapjava/characteristics/impl/base/StringCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/StringCharacteristic.java index 4373b06c9..5282042d4 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/base/StringCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/StringCharacteristic.java @@ -74,7 +74,7 @@ protected CompletableFuture getValue() { /** {@inheritDoc} */ @Override - protected String getDefault() { + public String getDefault() { return "Unknown"; } } From daa07eecee6a04a530ac4d33623822be28c760e1 Mon Sep 17 00:00:00 2001 From: Cody Cutrer Date: Tue, 11 Oct 2022 15:56:18 -0600 Subject: [PATCH 4/4] fix various small bugs where a BaseCharacteristic was given null for a callback --- CHANGES.md | 3 +++ .../impl/base/BaseCharacteristic.java | 19 +++++++++++++++---- .../impl/base/FloatCharacteristic.java | 2 +- .../impl/base/IntegerCharacteristic.java | 2 +- .../impl/base/StaticStringCharacteristic.java | 2 +- .../impl/base/StringCharacteristic.java | 4 ++-- 6 files changed, 23 insertions(+), 9 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 400e99ae2..debc2dfbf 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,6 @@ +# HAP-Java 2.0.2 + * Various minor stability issues for after an accessory has been removed. + # HAP-Java 2.0.1 ## Fixes * Log accessory names instead of futures. [#150](https://github.com/hap-java/HAP-Java/issues/150) diff --git a/src/main/java/io/github/hapjava/characteristics/impl/base/BaseCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/BaseCharacteristic.java index a0a302c29..77b0bc452 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/base/BaseCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/BaseCharacteristic.java @@ -125,15 +125,26 @@ public final void setValue(JsonValue jsonValue) { try { setValue(convert(jsonValue)); } catch (Exception e) { - logger.warn("Error while setting JSON value", e); + logger.warn( + "Error while setting JSON value {} for characteristic {}", + jsonValue, + getClass().getName(), + e); } } /** {@inheritDoc} */ @Override public void supplyValue(JsonObjectBuilder builder) { + CompletableFuture futureValue = getValue(); + + if (futureValue == null) { + setJsonValue(builder, getDefault()); + return; + } + try { - setJsonValue(builder, getValue().get()); + setJsonValue(builder, futureValue.get()); } catch (InterruptedException | ExecutionException e) { logger.warn("Error retrieving value", e); setJsonValue(builder, getDefault()); @@ -143,13 +154,13 @@ public void supplyValue(JsonObjectBuilder builder) { /** {@inheritDoc} */ @Override public void subscribe(HomekitCharacteristicChangeCallback callback) { - subscriber.get().accept(callback); + subscriber.ifPresent(s -> s.accept(callback)); } /** {@inheritDoc} */ @Override public void unsubscribe() { - unsubscriber.get().run(); + unsubscriber.ifPresent(u -> u.run()); } /** diff --git a/src/main/java/io/github/hapjava/characteristics/impl/base/FloatCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/FloatCharacteristic.java index 3781cc14d..a8a98dc27 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/base/FloatCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/FloatCharacteristic.java @@ -130,7 +130,7 @@ protected final CompletableFuture getValue() { @Override protected void setValue(Double value) throws Exception { - setter.get().accept(value); + if (setter.isPresent()) setter.get().accept(value); } /** {@inheritDoc} */ diff --git a/src/main/java/io/github/hapjava/characteristics/impl/base/IntegerCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/IntegerCharacteristic.java index 3ea8d87bc..22a6dce83 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/base/IntegerCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/IntegerCharacteristic.java @@ -77,7 +77,7 @@ protected CompletableFuture getValue() { @Override protected void setValue(Integer value) throws Exception { - setter.get().accept(value); + if (setter.isPresent()) setter.get().accept(value); } /** {@inheritDoc} */ diff --git a/src/main/java/io/github/hapjava/characteristics/impl/base/StaticStringCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/StaticStringCharacteristic.java index ec851bbf7..576df7e0e 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/base/StaticStringCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/StaticStringCharacteristic.java @@ -60,7 +60,7 @@ public void setValue(String value) throws Exception { /** {@inheritDoc} */ @Override protected CompletableFuture getValue() { - return getter.map(stringGetter -> stringGetter.get()).get(); + return getter.map(stringGetter -> stringGetter.get()).orElse(null); } /** {@inheritDoc} */ diff --git a/src/main/java/io/github/hapjava/characteristics/impl/base/StringCharacteristic.java b/src/main/java/io/github/hapjava/characteristics/impl/base/StringCharacteristic.java index 5282042d4..65cf45a71 100644 --- a/src/main/java/io/github/hapjava/characteristics/impl/base/StringCharacteristic.java +++ b/src/main/java/io/github/hapjava/characteristics/impl/base/StringCharacteristic.java @@ -63,13 +63,13 @@ public String convert(JsonValue jsonValue) { /** {@inheritDoc} */ @Override public void setValue(String value) throws Exception { - setter.get().accept(value); + if (setter.isPresent()) setter.get().accept(value); } /** {@inheritDoc} */ @Override protected CompletableFuture getValue() { - return getter.map(stringGetter -> stringGetter.get()).get(); + return getter.map(stringGetter -> stringGetter.get()).orElse(null); } /** {@inheritDoc} */