Return-Path: X-Original-To: apmail-brooklyn-commits-archive@minotaur.apache.org Delivered-To: apmail-brooklyn-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 398DBC8BD for ; Sat, 15 Nov 2014 18:50:36 +0000 (UTC) Received: (qmail 53005 invoked by uid 500); 15 Nov 2014 18:50:36 -0000 Delivered-To: apmail-brooklyn-commits-archive@brooklyn.apache.org Received: (qmail 52980 invoked by uid 500); 15 Nov 2014 18:50:36 -0000 Mailing-List: contact commits-help@brooklyn.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@brooklyn.incubator.apache.org Delivered-To: mailing list commits@brooklyn.incubator.apache.org Received: (qmail 52971 invoked by uid 99); 15 Nov 2014 18:50:36 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 15 Nov 2014 18:50:36 +0000 X-ASF-Spam-Status: No, hits=-2000.6 required=5.0 tests=ALL_TRUSTED,RP_MATCHES_RCVD X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO mail.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with SMTP; Sat, 15 Nov 2014 18:50:12 +0000 Received: (qmail 52836 invoked by uid 99); 15 Nov 2014 18:50:10 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 15 Nov 2014 18:50:10 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 2A472943EC2; Sat, 15 Nov 2014 18:50:10 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: heneveld@apache.org To: commits@brooklyn.incubator.apache.org Date: Sat, 15 Nov 2014 18:50:10 -0000 Message-Id: <74912d206750417a960405fa50fe0e08@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [1/3] incubator-brooklyn git commit: Fix catalog item ordering for determining the latest stable. X-Virus-Checked: Checked by ClamAV on apache.org Repository: incubator-brooklyn Updated Branches: refs/heads/master 5d9708615 -> de1d8bcc0 Fix catalog item ordering for determining the latest stable. Prefer 2.3.0 over 2.3.0-build, 2.3.0-rc10 over 2.3.0-rc1 Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/9a36702a Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/9a36702a Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/9a36702a Branch: refs/heads/master Commit: 9a36702adedd30afb9b0b0e944fcf0f5e37032f5 Parents: 5d97086 Author: Svetoslav Neykov Authored: Sat Nov 15 20:18:17 2014 +0200 Committer: Svetoslav Neykov Committed: Sat Nov 15 20:19:43 2014 +0200 ---------------------------------------------------------------------- .../catalog/internal/CatalogItemComparator.java | 48 ++++++++++++++++---- .../internal/CatalogItemComparatorTest.java | 44 ++++++++++++++---- .../util/text/NaturalOrderComparatorTest.java | 26 ++++++++++- 3 files changed, 98 insertions(+), 20 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9a36702a/core/src/main/java/brooklyn/catalog/internal/CatalogItemComparator.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/catalog/internal/CatalogItemComparator.java b/core/src/main/java/brooklyn/catalog/internal/CatalogItemComparator.java index 5d1e108..d3e91c4 100644 --- a/core/src/main/java/brooklyn/catalog/internal/CatalogItemComparator.java +++ b/core/src/main/java/brooklyn/catalog/internal/CatalogItemComparator.java @@ -18,11 +18,17 @@ */ package brooklyn.catalog.internal; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; import java.util.Comparator; import brooklyn.catalog.CatalogItem; +import brooklyn.util.text.NaturalOrderComparator; /** + * Largest version first order. + * * When using the comparator to sort - first using symbolicName * and if equal puts larger versions first, snapshots at the back. */ @@ -43,8 +49,8 @@ public class CatalogItemComparator implements Comparator> { boolean isV1Snapshot = v1.toUpperCase().contains(SNAPSHOT); boolean isV2Snapshot = v2.toUpperCase().contains(SNAPSHOT); if (isV1Snapshot == isV2Snapshot) { - String[] v1Parts = v1.split("[^\\d]", 4); - String[] v2Parts = v2.split("[^\\d]", 4); + String[] v1Parts = split(v1); + String[] v2Parts = split(v2); return -compare(v1Parts, v2Parts); } else if (isV1Snapshot) { return 1; @@ -54,14 +60,32 @@ public class CatalogItemComparator implements Comparator> { } } + private String[] split(String v) { + Collection parts = new ArrayList(); + int startPos = 0; + int delimPos; + while ((delimPos = v.indexOf('.', startPos)) != -1) { + String part = v.substring(startPos, delimPos); + if (parse(part) != -1) { + parts.add(part); + } else { + break; + } + startPos = delimPos+1; + } + String remaining = v.substring(startPos); + parts.addAll(Arrays.asList(remaining.split("[^\\d]", 2))); + return parts.toArray(new String[parts.size()]); + } + private int compare(String[] v1Parts, String[] v2Parts) { int len = Math.max(v1Parts.length, v2Parts.length); for (int i = 0; i < len; i++) { if (i == v1Parts.length) { - return -1; + return isNumber(v2Parts[i]) ? -1 : 1; } if (i == v2Parts.length) { - return 1; + return isNumber(v1Parts[i]) ? 1 : -1; } String p1 = v1Parts[i]; @@ -73,19 +97,25 @@ public class CatalogItemComparator implements Comparator> { return compare(n1, n2); } } else if (n1 == -1 && n2 != -1) { - return 1; - } else if (n1 != -1 && n2 == -1) { return -1; + } else if (n1 != -1 && n2 == -1) { + return 1; } else { - int cmp = p1.compareTo(p2); - if (cmp != 0) { - return cmp; + int cmp = NaturalOrderComparator.INSTANCE.compare(p1, p2); + if (cmp < 0) { + return -1; + } else if (cmp > 0) { + return 1; } } } return 0; } + private boolean isNumber(String v) { + return parse(v) != -1; + } + //Replace with Integer.compare in J7 private int compare(int n1, int n2) { if (n1 == n2) { http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9a36702a/core/src/test/java/brooklyn/catalog/internal/CatalogItemComparatorTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/brooklyn/catalog/internal/CatalogItemComparatorTest.java b/core/src/test/java/brooklyn/catalog/internal/CatalogItemComparatorTest.java index 56ee998..fc4d261 100644 --- a/core/src/test/java/brooklyn/catalog/internal/CatalogItemComparatorTest.java +++ b/core/src/test/java/brooklyn/catalog/internal/CatalogItemComparatorTest.java @@ -19,25 +19,51 @@ package brooklyn.catalog.internal; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; import org.testng.annotations.Test; import brooklyn.catalog.CatalogItem; public class CatalogItemComparatorTest { + private static final String RC2 = "10.5.8-rc2"; + private static final String STABLE = "10.5.8"; @Test public void testComparison() { + compare("0.0.1", "0.0.2", 1); + compare("0.0.2", "0.0.1", -1); + compare("0.0.1-qual", "0.0.2", 1); + compare("0.0.1-qual", "0.0.1_qual", 0); + compare("0.0.1", "0.0.2-SNAPSHOT", -1); + compare("0.0.0_SNAPSHOT", "0.0.1-SNAPSHOT-20141111114709760", 1); + compare("2.0", "2.0.1-BUILD", 1); + compare("2.0.1", "2.0-BUILD", -1); + compare("2.0", "2.0-BUILD", -1); + compare("2.1", "2.0-BUILD", -1); + compare("1", "1.3", 1); + compare("1-beta", "1-rc2", 1); + compare("1-beta1", "1-beta10", 1); + + compare(STABLE, "10.5", -1); + compare(STABLE, STABLE, 0); + + compare(STABLE, "10.6", 1); + compare(STABLE, "10.5.8.1", 1); + + compare(RC2, "10.5.8-rc3", 1) ; + compare(RC2, "10.5.8-rc1", -1); + + compare(STABLE, RC2, -1); + + CatalogItemComparator cmp = CatalogItemComparator.INSTANCE; + assertTrue(cmp.compare(v(RC2), v("10.5.8-beta1")) == cmp.compare(v(RC2), v("10.5.8-beta3"))); + } + + private void compare(String v1, String v2, int expected) { CatalogItemComparator cmp = CatalogItemComparator.INSTANCE; - assertEquals(cmp.compare(v("0.0.1"), v("0.0.2")), 1); - assertEquals(cmp.compare(v("0.0.2"), v("0.0.1")), -1); - assertEquals(cmp.compare(v("0.0.1-qual"), v("0.0.2")), 1); - assertEquals(cmp.compare(v("0.0.1-qual"), v("0.0.1_qual")), 0); - assertEquals(cmp.compare(v("0.0.1"), v("0.0.2-SNAPSHOT")), -1); - assertEquals(cmp.compare(v("0.0.0_SNAPSHOT"), v("0.0.1-SNAPSHOT-20141111114709760")), 1); - assertEquals(cmp.compare(v("2.0"), v("2.0.1-BUILD")), 1); - assertEquals(cmp.compare(v("2.0"), v("2.0-BUILD")), 1); - assertEquals(cmp.compare(v("2.1"), v("2.0-BUILD")), -1); + assertEquals(cmp.compare(v(v1), v(v2)), expected); + assertEquals(cmp.compare(v(v2), v(v1)), -expected); } private CatalogItem v(String version) { http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9a36702a/utils/common/src/test/java/brooklyn/util/text/NaturalOrderComparatorTest.java ---------------------------------------------------------------------- diff --git a/utils/common/src/test/java/brooklyn/util/text/NaturalOrderComparatorTest.java b/utils/common/src/test/java/brooklyn/util/text/NaturalOrderComparatorTest.java index 51597d4..6c109cf 100644 --- a/utils/common/src/test/java/brooklyn/util/text/NaturalOrderComparatorTest.java +++ b/utils/common/src/test/java/brooklyn/util/text/NaturalOrderComparatorTest.java @@ -28,6 +28,7 @@ public class NaturalOrderComparatorTest { public static final NaturalOrderComparator noc = new NaturalOrderComparator(); ComparableVersion v = new ComparableVersion("10.5.8"); + ComparableVersion v_rc2 = new ComparableVersion("10.5.8-rc2"); @Test public void testBasicOnes() { @@ -38,7 +39,14 @@ public class NaturalOrderComparatorTest { Assert.assertTrue(v.isLessThanAndNotEqualTo("10.6")); Assert.assertTrue(v.isLessThanOrEqualTo("10.5.8")); Assert.assertFalse(v.isLessThanAndNotEqualTo("10.5.8")); - + + Assert.assertTrue(v.isLessThanAndNotEqualTo("10.5.8.1")); + + Assert.assertTrue(v_rc2.isLessThanAndNotEqualTo("10.5.8-rc3")) ; + Assert.assertTrue(v_rc2.isGreaterThanAndNotEqualTo("10.5.8-rc1")); + + Assert.assertTrue(v_rc2.isGreaterThanAndNotEqualTo("10.5.8-beta1")==v_rc2.isGreaterThanAndNotEqualTo("10.5.8-beta3")); + Assert.assertTrue(v.isInRange("[10.5,10.6)")); Assert.assertFalse(v.isInRange("[10.5,10.5.8)")); Assert.assertTrue(v.isInRange("[10.5,)")); @@ -56,4 +64,18 @@ public class NaturalOrderComparatorTest { @Test(expectedExceptions={IllegalArgumentException.class}) public void testError3() { v.isInRange("[10.5]"); } -} + @Test(groups="WIP", enabled=false) + public void testUnderscoreDoesNotChangeMeaningOfNumberInNoc() { + // why?? + Assert.assertTrue(noc.compare("0.0.0_SNAPSHOT", "0.0.1-SNAPSHOT-20141111114709760") < 0); + + Assert.assertTrue(v.isGreaterThanAndNotEqualTo(v_rc2.version)); + Assert.assertTrue(v_rc2.isLessThanAndNotEqualTo(v.version)); + } + + @Test(groups="WIP", enabled=false) + public void testUnderscoreDoesNotChangeMeaningOfNumberInOurWorld() { + Assert.assertTrue(new ComparableVersion("0.0.0_SNAPSHOT").isLessThanAndNotEqualTo("0.0.1-SNAPSHOT-20141111114709760")); + } + +} \ No newline at end of file