package org.openstack.atlas.util.ca.util; import org.openstack.atlas.util.ca.StringUtils; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; public class ClassSet extends HashSet<Class> { public ClassSet(int initialCapacity) { super(initialCapacity); } public ClassSet(int initialCapacity, float loadFactor) { super(initialCapacity, loadFactor); } public ClassSet(Collection c) { super(c); } // Allow the creation of a set with only 1 class at construction time public ClassSet(Class... c) { super(); for (int i = 0; i < c.length; i++) { this.add(c[i]); } } public ClassSet() { super(); } public ClassSet getSupersOf(Class queryClass) { ClassSet supers = new ClassSet(); for (Class classFromSet : this) { if (classFromSet == null) { continue; } if (isSuperOf(classFromSet, queryClass)) { supers.add(classFromSet); } } return supers; } public ClassSet getExtendersOf(Class queryClass) { ClassSet childClasses = new ClassSet(); for (Class classFromSet : this) { if (classFromSet == null) { continue; } if (isSuperOf(queryClass, classFromSet)) { childClasses.add(classFromSet); } } return childClasses; } public boolean hasSupersOf(Class queryClass) { return getSupersOf(queryClass).size() > 0; } @Override public String toString() { List<String> classNames = new ArrayList<String>(); for (Class c : this) { if (c == null) { continue; } String className = c.getCanonicalName(); if (className == null) { className = "null"; } classNames.add(String.format("\"%s\"", className)); } Collections.sort(classNames); return String.format("{%s}", StringUtils.joinString(classNames, ",")); } public static boolean isSuperOf(Class expectedParent, Class expectedChild) { if (expectedParent.equals(expectedChild)) { return false; } return expectedParent.isAssignableFrom(expectedChild); } public static ClassSet fromInstances(Collection<Object> objs) { ClassSet classSetOut = new ClassSet(); for (Object obj : objs) { if (obj == null) { continue; } classSetOut.add(obj.getClass()); } return classSetOut; } public List<String> classNames() { List<String> names = new ArrayList<String>(); for (Class classInSet : this) { if (classInSet == null) { continue; } names.add(classInSet.getName()); } Collections.sort(names); return names; } }