/** * OpenSpotLight - Open Source IT Governance Platform * * Copyright (c) 2009, CARAVELATECH CONSULTORIA E TECNOLOGIA EM INFORMATICA LTDA * or third-party contributors as indicated by the @author tags or express * copyright attribution statements applied by the authors. All third-party * contributions are distributed under license by CARAVELATECH CONSULTORIA E * TECNOLOGIA EM INFORMATICA LTDA. * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA * *********************************************************************** * OpenSpotLight - Plataforma de Governança de TI de Código Aberto * * Direitos Autorais Reservados (c) 2009, CARAVELATECH CONSULTORIA E TECNOLOGIA * EM INFORMATICA LTDA ou como contribuidores terceiros indicados pela etiqueta * @author ou por expressa atribuição de direito autoral declarada e atribuída pelo autor. * Todas as contribuições de terceiros estão distribuídas sob licença da * CARAVELATECH CONSULTORIA E TECNOLOGIA EM INFORMATICA LTDA. * * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo sob os * termos da Licença Pública Geral Menor do GNU conforme publicada pela Free Software * Foundation. * * Este programa é distribuído na expectativa de que seja útil, porém, SEM NENHUMA * GARANTIA; nem mesmo a garantia implícita de COMERCIABILIDADE OU ADEQUAÇÃO A UMA * FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral Menor do GNU para mais detalhes. * * Você deve ter recebido uma cópia da Licença Pública Geral Menor do GNU junto com este * programa; se não, escreva para: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package org.openspotlight.common.util; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; /** * The Class ClassLoaderUtil. * * @author Vitor Hugo Chagas */ public class ClassLoaderUtil { /** * Recursive method used to find all classes in a given directory and subdirs. * * @param directory The base directory * @param packageName The package name for classes found inside the base directory * @return The classes * @throws ClassNotFoundException the class not found exception */ private static List<Class<?>> findClasses(final File directory, final String packageName) throws ClassNotFoundException { final List<Class<?>> classes = new ArrayList<Class<?>>(); if (!directory.exists()) { return classes; } final File[] files = directory.listFiles(); for (final File file: files) { if (file.isDirectory()) { assert !file.getName().contains("."); classes.addAll(findClasses(file, packageName + "." + file.getName())); } else if (file.getName().endsWith(".class")) { classes.add(Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6))); } } return classes; } /** * Method used to check is some class exists at JVM. * * @param className The class name to check if it is already lives on JVM. * @return True is class exists, False otherwise. */ public static boolean existsClass(final String className) { try { Class.forName(className); return true; } catch (final ClassNotFoundException e) { return false; } } /** * Method used to return some class that exists at JVM. * * @param className The class name. * @return If class exists returns it, otherwise returns null. */ public static Class<?> getClass(final String className) { try { return Class.forName(className); } catch (final ClassNotFoundException e) { return null; } } /** * Scans all classes accessible from the context class loader which belong to the given package and subpackages. * * @param packageName The base package * @return The classes * @throws ClassNotFoundException the class not found exception * @throws IOException Signals that an I/O exception has occurred. */ public static Class<?>[] getClasses(final String packageName) throws ClassNotFoundException, IOException { final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); assert classLoader != null; final String path = packageName.replace('.', '/'); final Enumeration<URL> resources = classLoader.getResources(path); final List<File> dirs = new ArrayList<File>(); while (resources.hasMoreElements()) { final URL resource = resources.nextElement(); dirs.add(new File(resource.getFile())); } final ArrayList<Class<?>> classes = new ArrayList<Class<?>>(); for (final File directory: dirs) { classes.addAll(findClasses(directory, packageName)); } return classes.toArray(new Class[classes.size()]); } }