package restx.classloader; import com.google.common.base.Charsets; import com.google.common.base.Splitter; import com.google.common.collect.ImmutableSet; import com.google.common.io.Resources; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.net.URL; import java.util.Enumeration; /** * Helper methods to manage cold classes. * * @author apeyrard */ public class ColdClasses { private static final Logger logger = LoggerFactory.getLogger(ColdClasses.class); public static final String COLD_CLASSES_FILE_PATH = "META-INF/cold-classes.list"; private ColdClasses() {} /** * Extracts the cold classes from a string containing a list of cold classes. * <p> * The {@code coldClasses} parameter contains a list of fqcn separated by ',' character. * * @param classLoader the classloader to load cold classes * @param coldClasses all cold classes in a string * @return a set of cold classes */ public static ImmutableSet<Class<?>> extractFromString(ClassLoader classLoader, String coldClasses) { ImmutableSet.Builder<Class<?>> classes = ImmutableSet.builder(); for (String fqcn : Splitter.on(',').trimResults().split(coldClasses)) { try { classes.add(classLoader.loadClass(fqcn)); } catch (ClassNotFoundException e) { logger.warn("invalid cold class {}: unable to find it from supplied classloader", fqcn); } } return classes.build(); } /** * Extracts the cold classes from resources file. * * @param classLoader the classloader to load cold classes and resources * @return the list of cold classes * @throws java.io.IOException if an I/O error occurs */ public static ImmutableSet<Class<?>> extractFromResources(final ClassLoader classLoader) throws IOException { ImmutableSet.Builder<Class<?>> classes = ImmutableSet.builder(); Enumeration<URL> resources = classLoader.getResources(COLD_CLASSES_FILE_PATH); while (resources.hasMoreElements()) { for (String fqcn : Resources.readLines(resources.nextElement(), Charsets.UTF_8)) { try { classes.add(classLoader.loadClass(fqcn)); } catch (ClassNotFoundException e) { logger.warn("invalid cold class {}: unable to find it from supplied classloader", fqcn); } } } return classes.build(); } }