package com.aptana.rdt.core.gems; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; import java.util.List; import java.util.SortedSet; import java.util.StringTokenizer; import java.util.TreeSet; public class LogicalGem extends Gem { private Collection<Gem> gems; private LogicalGem(Collection<Gem> gems, String name, String version, String description) { super(name, version, description); this.gems = gems; } public static LogicalGem create(Collection<Gem> gems) { if (gems == null || gems.isEmpty()) throw new IllegalArgumentException("Need a non-null, non-empty Collection of Gems"); String name = null; String description = null; String version = "("; for (Gem gem : gems) { if (name == null) name = gem.getName(); if (description == null) description = gem.getDescription(); version += gem.getVersion() + ", "; } version = new String(version.substring(0, version.length() - 2)); version += ')'; // XXX Need to take platform into account!!!!!!!! return new LogicalGem(gems, name, version, description); } public SortedSet<String> getVersions() { String raw = new String(getVersion().substring(1, getVersion().length() - 1)); SortedSet<String> version = new TreeSet<String>(new VersionComparator()); StringTokenizer tokenizer = new StringTokenizer(raw, ","); while (tokenizer.hasMoreTokens()) { version.add(tokenizer.nextToken().trim()); } return version; } private class VersionComparator implements Comparator<String> { public int compare(String v1, String v2) { List<Integer> v1Parts = getParts(v1); List<Integer> v2Parts = getParts(v2); int blah = Math.min(v1Parts.size(), v2Parts.size()); for (int i = 0; i < blah; i++) { Integer one = v1Parts.get(i); Integer two = v2Parts.get(i); int result = one.compareTo(two); if (result != 0) return result; } // if parts sizes aren't equal, the one with more parts is newer. if (v1Parts.size() > v2Parts.size()) { return 1; } else if (v2Parts.size() > v1Parts.size()) { return -1; } return 0; } private List<Integer> getParts(String version) { StringTokenizer tokenizer = new StringTokenizer(version, "."); List<Integer> parts = new ArrayList<Integer>(); while (tokenizer.hasMoreTokens()) { parts.add(Integer.parseInt(tokenizer.nextToken())); } return parts; } } public Collection<Gem> getGems() { return gems; } }