You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2014/11/15 02:03:40 UTC

[1/3] incubator-brooklyn git commit: Catalog item comparator - implement custom

Repository: incubator-brooklyn
Updated Branches:
  refs/heads/master c4061feaf -> f14331054


Catalog item comparator - implement custom

The NaturalOrderComparator leads to unexpected sort order (i.e 0.0.0_SNAPSHOT and 0.0.1-SNAPSHOT-20141111114709760). OSGi's Version class and other semver java implementations are too strict.


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/253583e8
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/253583e8
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/253583e8

Branch: refs/heads/master
Commit: 253583e8cc68c8edf8bee5c725497bd393b8be02
Parents: fa7ba6f
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Sat Nov 15 00:13:22 2014 +0200
Committer: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Committed: Sat Nov 15 00:28:05 2014 +0200

----------------------------------------------------------------------
 .../catalog/internal/CatalogItemComparator.java | 65 ++++++++++++++++++--
 .../internal/CatalogItemComparatorTest.java     | 46 ++++++++++++++
 2 files changed, 105 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/253583e8/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 d8a2b2e..5d1e108 100644
--- a/core/src/main/java/brooklyn/catalog/internal/CatalogItemComparator.java
+++ b/core/src/main/java/brooklyn/catalog/internal/CatalogItemComparator.java
@@ -21,7 +21,6 @@ package brooklyn.catalog.internal;
 import java.util.Comparator;
 
 import brooklyn.catalog.CatalogItem;
-import brooklyn.util.text.NaturalOrderComparator;
 
 /**
  * When using the comparator to sort - first using symbolicName
@@ -38,12 +37,15 @@ public class CatalogItemComparator implements Comparator<CatalogItem<?, ?>> {
         if (symbolicNameComparison != 0) {
             return symbolicNameComparison;
         } else {
-            String v1 = o1.getVersion().toUpperCase();
-            String v2 = o2.getVersion().toUpperCase();
-            boolean isV1Snapshot = v1.contains(SNAPSHOT);
-            boolean isV2Snapshot = v2.contains(SNAPSHOT);
+            String v1 = o1.getVersion();
+            String v2 = o2.getVersion();
+
+            boolean isV1Snapshot = v1.toUpperCase().contains(SNAPSHOT);
+            boolean isV2Snapshot = v2.toUpperCase().contains(SNAPSHOT);
             if (isV1Snapshot == isV2Snapshot) {
-                return -NaturalOrderComparator.INSTANCE.compare(v1, v2);
+                String[] v1Parts = v1.split("[^\\d]", 4);
+                String[] v2Parts = v2.split("[^\\d]", 4);
+                return -compare(v1Parts, v2Parts);
             } else if (isV1Snapshot) {
                 return 1;
             } else {
@@ -51,4 +53,55 @@ public class CatalogItemComparator implements Comparator<CatalogItem<?, ?>> {
             }
         }
     }
+
+    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;
+            }
+            if (i == v2Parts.length) {
+                return 1;
+            }
+
+            String p1 = v1Parts[i];
+            String p2 = v2Parts[i];
+            int n1 = parse(p1);
+            int n2 = parse(p2);
+            if (n1 != -1 && n2 != -1) {
+                if (n1 != n2) {
+                    return compare(n1, n2);
+                }
+            } 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;
+                }
+            }
+        }
+        return 0;
+    }
+
+    //Replace with Integer.compare in J7
+    private int compare(int n1, int n2) {
+        if (n1 == n2) {
+            return 0;
+        } else if (n1 < n2) {
+            return -1;
+        } else {
+            return 1;
+        }
+    }
+
+    private int parse(String p) {
+        try {
+            return Integer.parseInt(p);
+        } catch (NumberFormatException e) {
+            return -1;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/253583e8/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
new file mode 100644
index 0000000..56ee998
--- /dev/null
+++ b/core/src/test/java/brooklyn/catalog/internal/CatalogItemComparatorTest.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package brooklyn.catalog.internal;
+
+import static org.testng.Assert.assertEquals;
+
+import org.testng.annotations.Test;
+
+import brooklyn.catalog.CatalogItem;
+
+public class CatalogItemComparatorTest {
+
+    @Test
+    public void testComparison() {
+        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);
+    }
+    
+    private CatalogItem<?, ?> v(String version) {
+        return CatalogItemBuilder.newEntity("xxx", version).build();
+    }
+}


[3/3] incubator-brooklyn git commit: This closes #331

Posted by he...@apache.org.
This closes #331


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/f1433105
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/f1433105
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/f1433105

Branch: refs/heads/master
Commit: f14331054b92fafa98d890a1679d672a45f48238
Parents: c4061fe 5868b7d
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Sat Nov 15 01:03:07 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Sat Nov 15 01:03:07 2014 +0000

----------------------------------------------------------------------
 .../catalog/internal/CatalogItemComparator.java | 65 ++++++++++++++++++--
 .../internal/CatalogItemComparatorTest.java     | 46 ++++++++++++++
 .../software/MachineLifecycleEffectorTasks.java |  8 ++-
 3 files changed, 112 insertions(+), 7 deletions(-)
----------------------------------------------------------------------



[2/3] incubator-brooklyn git commit: Fix NPE on creating entities with no explicit location

Posted by he...@apache.org.
Fix NPE on creating entities with no explicit location


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/5868b7d6
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/5868b7d6
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/5868b7d6

Branch: refs/heads/master
Commit: 5868b7d65a247512cb14d78f0406ca7de52eb508
Parents: 253583e
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Sat Nov 15 00:14:28 2014 +0200
Committer: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Committed: Sat Nov 15 00:28:10 2014 +0200

----------------------------------------------------------------------
 .../entity/software/MachineLifecycleEffectorTasks.java       | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/5868b7d6/software/base/src/main/java/brooklyn/entity/software/MachineLifecycleEffectorTasks.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/software/MachineLifecycleEffectorTasks.java b/software/base/src/main/java/brooklyn/entity/software/MachineLifecycleEffectorTasks.java
index 65b0428..8381e99 100644
--- a/software/base/src/main/java/brooklyn/entity/software/MachineLifecycleEffectorTasks.java
+++ b/software/base/src/main/java/brooklyn/entity/software/MachineLifecycleEffectorTasks.java
@@ -152,12 +152,18 @@ public abstract class MachineLifecycleEffectorTasks {
         return new EffectorBody<Void>() {
             @Override
             public Void call(ConfigBag parameters) {
+                Collection<? extends Location> locations  = null;
+
                 Object locationsRaw = parameters.getStringKey(LOCATIONS.getName());
-                Collection<? extends Location> locations = Locations.coerceToCollection(entity().getManagementContext(), locationsRaw);
+                if (locationsRaw != null) {
+                    locations = Locations.coerceToCollection(entity().getManagementContext(), locationsRaw);
+                }
+
                 if (locations==null) {
                     // null/empty will mean to inherit from parent
                     locations = Collections.emptyList();
                 }
+
                 start(locations);
                 return null;
             }