package org.bndtools.templating; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.SortedMap; import java.util.SortedSet; import java.util.TreeMap; import java.util.TreeSet; import org.osgi.framework.Version; public final class Category implements Comparable<Category> { private final String name; private final SortedSet<Template> templates = new TreeSet<>(new Comparator<Template>() { @Override public int compare(Template t1, Template t2) { // First sort on ranking int diff = t2.getRanking() - t1.getRanking(); if (diff != 0) return diff; // Sort on name diff = t1.getName().compareTo(t2.getName()); if (diff != 0) return diff; // Finally sort on version -- again, intentionally backwards Version v1 = t1.getVersion(); if (v1 == null) v1 = Version.emptyVersion; Version v2 = t2.getVersion(); if (v2 == null) v2 = Version.emptyVersion; return v1.compareTo(v2); } }); private final String prefix; public static List<Category> categorise(Collection<Template> templates) { SortedMap<Category,Category> cats = new TreeMap<>(); for (Template template : templates) { Category tmp = new Category(template.getCategory()); Category category = cats.get(tmp); if (category == null) { category = tmp; cats.put(category, category); } category.add(template); } List<Category> rootList = new ArrayList<>(cats.size()); rootList.addAll(cats.keySet()); return rootList; } public Category(String fullName) { int slashIndex = fullName.indexOf('/'); if (slashIndex >= 0) { this.prefix = fullName.substring(0, slashIndex); this.name = fullName.substring(slashIndex + 1); } else { this.prefix = null; this.name = fullName; } } public String getPrefix() { return prefix; } public String getName() { return name; } public Collection<Template> getTemplates() { return Collections.unmodifiableCollection(templates); } public void add(Template template) { templates.add(template); } @Override public int compareTo(Category o) { int diff; if (this.prefix == null) diff = o.prefix == null ? 0 : 1; else if (o.prefix == null) diff = -1; else diff = this.prefix.compareTo(o.prefix); if (diff != 0) return diff; return this.name.compareTo(o.name); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((prefix == null) ? 0 : prefix.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Category other = (Category) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (prefix == null) { if (other.prefix != null) return false; } else if (!prefix.equals(other.prefix)) return false; return true; } }