From 223eaa43101d87e46a4417cd997725b964deabe7 Mon Sep 17 00:00:00 2001 From: Christoph Weitkamp Date: Mon, 22 Jan 2018 22:35:25 +0100 Subject: [PATCH] [Tradfri] Added better version check (#4930) * Added better version check Signed-off-by: Christoph Weitkamp --- .../pom.xml | 9 +- .../internal/model/TradfriVersionTest.java | 81 +++++++++++++++++ .../handler/TradfriGatewayHandler.java | 5 +- .../internal/model/TradfriVersion.java | 90 +++++++++++++++++++ 4 files changed, 175 insertions(+), 10 deletions(-) create mode 100644 extensions/binding/org.eclipse.smarthome.binding.tradfri.test/src/test/java/org/eclipse/smarthome/binding/tradfri/internal/model/TradfriVersionTest.java create mode 100644 extensions/binding/org.eclipse.smarthome.binding.tradfri/src/main/java/org/eclipse/smarthome/binding/tradfri/internal/model/TradfriVersion.java diff --git a/extensions/binding/org.eclipse.smarthome.binding.tradfri.test/pom.xml b/extensions/binding/org.eclipse.smarthome.binding.tradfri.test/pom.xml index f0bf1180920..83bf919a1e8 100644 --- a/extensions/binding/org.eclipse.smarthome.binding.tradfri.test/pom.xml +++ b/extensions/binding/org.eclipse.smarthome.binding.tradfri.test/pom.xml @@ -12,15 +12,9 @@ org.eclipse.smarthome.archetype org.eclipse.smarthome.binding.tradfri.test 0.10.0-SNAPSHOT - eclipse-test-plugin TRÅDFRI Binding Tests - - - org.eclipse.smarthome.binding.tradfri.test - org.eclipse.smarthome.binding.tradfri - - + eclipse-test-plugin @@ -28,7 +22,6 @@ ${tycho-groupid} target-platform-configuration - diff --git a/extensions/binding/org.eclipse.smarthome.binding.tradfri.test/src/test/java/org/eclipse/smarthome/binding/tradfri/internal/model/TradfriVersionTest.java b/extensions/binding/org.eclipse.smarthome.binding.tradfri.test/src/test/java/org/eclipse/smarthome/binding/tradfri/internal/model/TradfriVersionTest.java new file mode 100644 index 00000000000..7a465893c7f --- /dev/null +++ b/extensions/binding/org.eclipse.smarthome.binding.tradfri.test/src/test/java/org/eclipse/smarthome/binding/tradfri/internal/model/TradfriVersionTest.java @@ -0,0 +1,81 @@ +/** + * Copyright (c) 2014,2018 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * 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.eclipse.smarthome.binding.tradfri.internal.model; + +import static org.junit.Assert.*; + +import java.util.Arrays; + +import org.junit.Test; + +/** + * Tests for {@link TradfriVersion}. + * + * @author Christoph Weitkamp - Initial contribution + */ +public class TradfriVersionTest { + + private static final int LESS_THAN = -1; + private static final int EQUAL_TO = 0; + private static final int GREATER_THAN = 1; + + private static final String VERSION_STRING = "1.2.42"; + private static final TradfriVersion VERSION = new TradfriVersion(VERSION_STRING); + + @Test(expected = IllegalArgumentException.class) + public void testIllegalArgumentException() throws IllegalArgumentException { + new TradfriVersion("FAILURE"); + } + + @Test + public void testParts() { + assertEquals(Arrays.asList(1, 2, 42), VERSION.parts); + } + + @Test + public void testCompareToEqualTo() { + assertEquals(EQUAL_TO, VERSION.compareTo(VERSION)); + assertEquals(EQUAL_TO, VERSION.compareTo(new TradfriVersion(VERSION_STRING))); + } + + @Test + public void testCompareToLessThan() { + assertEquals(LESS_THAN, VERSION.compareTo(new TradfriVersion("2"))); + assertEquals(LESS_THAN, VERSION.compareTo(new TradfriVersion("1.3"))); + assertEquals(LESS_THAN, VERSION.compareTo(new TradfriVersion("1.2.50"))); + assertEquals(LESS_THAN, VERSION.compareTo(new TradfriVersion("1.2.42.5"))); + } + + @Test + public void testCompareToGreaterThan() { + assertEquals(GREATER_THAN, VERSION.compareTo(new TradfriVersion("1"))); + assertEquals(GREATER_THAN, VERSION.compareTo(new TradfriVersion("1.1"))); + assertEquals(GREATER_THAN, VERSION.compareTo(new TradfriVersion("1.2.30"))); + } + + @SuppressWarnings("unlikely-arg-type") + @Test + public void testEquals() { + assertTrue(VERSION.equals(VERSION)); + assertTrue(VERSION.equals(new TradfriVersion(VERSION_STRING))); + + assertFalse(VERSION.equals((TradfriVersion) null)); + assertFalse(VERSION.equals(new Integer("1"))); + assertFalse(VERSION.equals(new TradfriVersion("1.2.5"))); + } + + @Test + public void testToString() { + assertEquals(VERSION_STRING, VERSION.toString()); + } +} diff --git a/extensions/binding/org.eclipse.smarthome.binding.tradfri/src/main/java/org/eclipse/smarthome/binding/tradfri/handler/TradfriGatewayHandler.java b/extensions/binding/org.eclipse.smarthome.binding.tradfri/src/main/java/org/eclipse/smarthome/binding/tradfri/handler/TradfriGatewayHandler.java index 2a3d28f3752..fc640cfa00a 100644 --- a/extensions/binding/org.eclipse.smarthome.binding.tradfri/src/main/java/org/eclipse/smarthome/binding/tradfri/handler/TradfriGatewayHandler.java +++ b/extensions/binding/org.eclipse.smarthome.binding.tradfri/src/main/java/org/eclipse/smarthome/binding/tradfri/handler/TradfriGatewayHandler.java @@ -39,6 +39,7 @@ import org.eclipse.smarthome.binding.tradfri.internal.TradfriCoapEndpoint; import org.eclipse.smarthome.binding.tradfri.internal.TradfriCoapHandler; import org.eclipse.smarthome.binding.tradfri.internal.config.TradfriGatewayConfig; +import org.eclipse.smarthome.binding.tradfri.internal.model.TradfriVersion; import org.eclipse.smarthome.config.core.Configuration; import org.eclipse.smarthome.core.thing.Bridge; import org.eclipse.smarthome.core.thing.ChannelUID; @@ -68,7 +69,7 @@ public class TradfriGatewayHandler extends BaseBridgeHandler implements CoapCall protected final Logger logger = LoggerFactory.getLogger(getClass()); - private static final String MIN_SUPPORTED_VERSION = "1.2.42"; + private static final TradfriVersion MIN_SUPPORTED_VERSION = new TradfriVersion("1.2.42"); private TradfriCoapClient deviceClient; private String gatewayURI; @@ -376,7 +377,7 @@ private boolean isNullOrEmpty(String string) { */ private boolean isOldFirmware() { String currentFirmware = thing.getProperties().get(Thing.PROPERTY_FIRMWARE_VERSION); - return currentFirmware == null || MIN_SUPPORTED_VERSION.compareTo(currentFirmware) > 0; + return currentFirmware == null || MIN_SUPPORTED_VERSION.compareTo(new TradfriVersion(currentFirmware)) > 0; } @Override diff --git a/extensions/binding/org.eclipse.smarthome.binding.tradfri/src/main/java/org/eclipse/smarthome/binding/tradfri/internal/model/TradfriVersion.java b/extensions/binding/org.eclipse.smarthome.binding.tradfri/src/main/java/org/eclipse/smarthome/binding/tradfri/internal/model/TradfriVersion.java new file mode 100644 index 00000000000..043f13a04f9 --- /dev/null +++ b/extensions/binding/org.eclipse.smarthome.binding.tradfri/src/main/java/org/eclipse/smarthome/binding/tradfri/internal/model/TradfriVersion.java @@ -0,0 +1,90 @@ +/** + * Copyright (c) 2014,2018 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * 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.eclipse.smarthome.binding.tradfri.internal.model; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; + +/** + * The {@link TradfriVersion} class is a default implementation for comparing TRÅDFRI versions. + * + * @author Christoph Weitkamp - Initial contribution + */ +@NonNullByDefault +public class TradfriVersion implements Comparable { + private static final String VERSION_PATTERN = "[0-9]+(\\.[0-9]+)*"; + private static final String VERSION_DELIMITER = "\\."; + final List parts; + + /** + * Create a new instance. + * + * @param version the version string + */ + public TradfriVersion(final String version) { + if (!version.matches(VERSION_PATTERN)) { + throw new IllegalArgumentException("TradfriVersion cannot be created as version has invalid format."); + } + parts = Arrays.stream(version.split(VERSION_DELIMITER)).map(part -> Integer.parseInt(part)) + .collect(Collectors.toList()); + } + + @Override + public int compareTo(final TradfriVersion other) { + int minSize = Math.min(parts.size(), other.parts.size()); + for (int i = 0; i < minSize; ++i) { + int diff = parts.get(i) - other.parts.get(i); + if (diff == 0) { + continue; + } else if (diff < 0) { + return -1; + } else { + return 1; + } + } + for (int i = minSize; i < parts.size(); ++i) { + if (parts.get(i) != 0) { + return 1; + } + } + for (int i = minSize; i < other.parts.size(); ++i) { + if (other.parts.get(i) != 0) { + return -1; + } + } + return 0; + } + + @Override + public boolean equals(@Nullable Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + return compareTo((TradfriVersion) obj) == 0; + } + + @Override + public String toString() { + return parts.stream().map(String::valueOf).collect(Collectors.joining(".")); + } +}