Catalog versioning - when no explicit version use the highest version (preferring non-snapshot)
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/1a9d0e30 Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/1a9d0e30 Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/1a9d0e30 Branch: refs/heads/master Commit: 1a9d0e30972c717d30d9bae94613bf8197ab82ba Parents: 415619a Author: Svetoslav Neykov <svetoslav.ney...@cloudsoftcorp.com> Authored: Mon Nov 10 19:39:35 2014 +0200 Committer: Svetoslav Neykov <svetoslav.ney...@cloudsoftcorp.com> Committed: Thu Nov 13 11:49:52 2014 +0200 ---------------------------------------------------------------------- .../catalog/internal/BasicBrooklynCatalog.java | 2 +- .../catalog/internal/CatalogItemComparator.java | 33 ++++++++++++++++++++ .../internal/CatalogItemVersionComparator.java | 16 ---------- .../src/main/webapp/assets/js/view/catalog.js | 6 ++-- .../rest/resources/CatalogResource.java | 13 +++++--- 5 files changed, 44 insertions(+), 26 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1a9d0e30/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java b/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java index f74e24c..ed85e76 100644 --- a/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java +++ b/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java @@ -193,7 +193,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog { private String getDefaultVersion(String symbolicName) { Iterable<CatalogItem<Object, Object>> versions = getCatalogItems(CatalogPredicates.symbolicName(Predicates.equalTo(symbolicName))); - ImmutableSortedSet<CatalogItem<?, ?>> orderedVersions = ImmutableSortedSet.orderedBy(new CatalogItemVersionComparator()).addAll(versions).build(); + ImmutableSortedSet<CatalogItem<?, ?>> orderedVersions = ImmutableSortedSet.orderedBy(new CatalogItemComparator()).addAll(versions).build(); if (!orderedVersions.isEmpty()) { return orderedVersions.iterator().next().getVersion(); } else { http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1a9d0e30/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 new file mode 100644 index 0000000..f5523e2 --- /dev/null +++ b/core/src/main/java/brooklyn/catalog/internal/CatalogItemComparator.java @@ -0,0 +1,33 @@ +package brooklyn.catalog.internal; + +import java.util.Comparator; + +import brooklyn.catalog.CatalogItem; +import brooklyn.util.text.NaturalOrderComparator; + +public class CatalogItemComparator implements Comparator<CatalogItem<?, ?>> { + private static final String SNAPSHOT = "SNAPSHOT"; + private static final Comparator<String> COMPARATOR = new NaturalOrderComparator(); + + public static final CatalogItemComparator INSTANCE = new CatalogItemComparator(); + + @Override + public int compare(CatalogItem<?, ?> o1, CatalogItem<?, ?> o2) { + int symbolicNameComparison = o1.getSymbolicName().compareTo(o2.getSymbolicName()); + 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); + if (isV1Snapshot == isV2Snapshot) { + return -COMPARATOR.compare(v1, v2); + } else if (isV1Snapshot) { + return 1; + } else { + return -1; + } + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1a9d0e30/core/src/main/java/brooklyn/catalog/internal/CatalogItemVersionComparator.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/brooklyn/catalog/internal/CatalogItemVersionComparator.java b/core/src/main/java/brooklyn/catalog/internal/CatalogItemVersionComparator.java deleted file mode 100644 index 3e279a4..0000000 --- a/core/src/main/java/brooklyn/catalog/internal/CatalogItemVersionComparator.java +++ /dev/null @@ -1,16 +0,0 @@ -package brooklyn.catalog.internal; - -import java.util.Comparator; - -import brooklyn.catalog.CatalogItem; - -public class CatalogItemVersionComparator implements Comparator<CatalogItem<?, ?>> { - - protected CatalogItemVersionComparator() {} - - @Override - public int compare(CatalogItem<?, ?> o1, CatalogItem<?, ?> o2) { - return -o1.getVersion().compareTo(o2.getVersion()); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1a9d0e30/usage/jsgui/src/main/webapp/assets/js/view/catalog.js ---------------------------------------------------------------------- diff --git a/usage/jsgui/src/main/webapp/assets/js/view/catalog.js b/usage/jsgui/src/main/webapp/assets/js/view/catalog.js index cf14684..2d6aa8b 100644 --- a/usage/jsgui/src/main/webapp/assets/js/view/catalog.js +++ b/usage/jsgui/src/main/webapp/assets/js/view/catalog.js @@ -319,7 +319,6 @@ define([ isChild: isChild, extraClasses: (activeDetailsView == this.name && model.cid == this.activeCid) ? "active" : "" }, this.entryTemplateArgs(model)); - console.log(args); return this.template(args); }, @@ -376,9 +375,8 @@ define([ var orderedIds = _.uniq(this.collection.map(symbolicNameFn), true); function getLatestStableVersion(items) { - //TODO implement more sophisticated "default" version selection - //Could let the server choose it - return items[items.length-1]; + //the server sorts items by descending version, snapshots at the back + return items[0]; } var catalogTree = orderedIds.map(function(symbolicName) { http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1a9d0e30/usage/rest-server/src/main/java/brooklyn/rest/resources/CatalogResource.java ---------------------------------------------------------------------- diff --git a/usage/rest-server/src/main/java/brooklyn/rest/resources/CatalogResource.java b/usage/rest-server/src/main/java/brooklyn/rest/resources/CatalogResource.java index 188825f..ad1324d 100644 --- a/usage/rest-server/src/main/java/brooklyn/rest/resources/CatalogResource.java +++ b/usage/rest-server/src/main/java/brooklyn/rest/resources/CatalogResource.java @@ -39,6 +39,7 @@ import brooklyn.catalog.CatalogItem; import brooklyn.catalog.CatalogPredicates; import brooklyn.catalog.internal.BasicBrooklynCatalog; import brooklyn.catalog.internal.CatalogDto; +import brooklyn.catalog.internal.CatalogItemComparator; import brooklyn.catalog.internal.CatalogUtils; import brooklyn.entity.Entity; import brooklyn.entity.proxying.EntitySpec; @@ -48,7 +49,6 @@ import brooklyn.rest.api.CatalogApi; import brooklyn.rest.domain.ApiError; import brooklyn.rest.domain.CatalogEntitySummary; import brooklyn.rest.domain.CatalogItemSummary; -import brooklyn.rest.domain.SummaryComparators; import brooklyn.rest.transform.CatalogTransformer; import brooklyn.rest.util.WebResourceUtils; import brooklyn.util.ResourceUtils; @@ -62,6 +62,8 @@ import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.FluentIterable; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; import com.google.common.io.Files; import com.sun.jersey.core.header.FormDataContentDisposition; @@ -236,10 +238,11 @@ public class CatalogResource extends AbstractBrooklynRestResource implements Cat if (Strings.isNonEmpty(fragment)) filters.add(CatalogPredicates.xml(StringPredicates.containsLiteralIgnoreCase(fragment))); - return FluentIterable.from(brooklyn().getCatalog().getCatalogItems()) - .filter(Predicates.and(filters)) - .transform(TO_CATALOG_ITEM_SUMMARY) - .toSortedList(SummaryComparators.displayNameComparator()); + ImmutableList<CatalogItem<Object, Object>> sortedItems = + FluentIterable.from(brooklyn().getCatalog().getCatalogItems()) + .filter(Predicates.and(filters)) + .toSortedList(CatalogItemComparator.INSTANCE); + return Lists.transform(sortedItems, TO_CATALOG_ITEM_SUMMARY); } @Override