package org.jacp.demo.main; import java.io.File; import java.io.FilenameFilter; import java.util.StringTokenizer; import java.util.Vector; /** * Created with IntelliJ IDEA. * User: ady * Date: 19.07.13 * Time: 14:22 * To change this template use File | Settings | File Templates. */ public class ClassFinderOrig { /** * Defined classpath */ private static final String CLASSPATH = System.getProperty("java.class.path"); /** * List with the jar files on the classpath */ private static String[] jarFiles; /** * List with the directories on the classpath (containing .class files) */ private static String[] binDirs; /** * All Classpath elements */ private static File[] classPathDirs = null; /** * Default constructur initializes the directories indicated by the * CLASSPATH, if they are not yet initialized. */ public ClassFinderOrig() { if (classPathDirs == null) { initClassPathDir(); } } /** * Initialize the directories based on the classpath */ private void initClassPathDir() { StringTokenizer st = new StringTokenizer(CLASSPATH, File.pathSeparator); int count = st.countTokens(); classPathDirs = new File[count]; Vector jar = new Vector(); Vector bin = new Vector(); for (int i = 0; i < count; i++) { classPathDirs[i] = new File(st.nextToken()); if (classPathDirs[i].isDirectory()) { bin.add(classPathDirs[i].getAbsolutePath()); } else { jar.add(classPathDirs[i].getAbsolutePath()); } } jarFiles = new String[jar.size()]; binDirs = new String[bin.size()]; jar.copyInto(jarFiles); bin.copyInto(binDirs); } /** * Retrive all classes of the indicated package. The package is searched in * all classpath directories that are directories * * @param packageName * name of the package as 'ch.sahits.civ' * @return Array of found classes * @throws ClassNotFoundException */ public Class[] getAll(String packageName) throws ClassNotFoundException { String packageDir = convertPackege(packageName); Vector classes = new Vector(); for (int i = 0; i < binDirs.length; i++) { packageDir = binDirs[i] + File.separator + packageDir; // System.out.println("DIR: "+packageDir); File dir = new File(packageDir); // System.out.println("DIR exists: "+dir.exists()); classes.addAll(extractClasses(packageName, dir)); } Class[] result = new Class[classes.size()]; classes.copyInto(result); return result; } /** * Extract all the classes from a directory * @param packageName name of the package as 'ch.sahits.civ' * @param dir Package as directory * @return Vector with all found directories * @throws ClassNotFoundException */ private Vector extractClasses(String packageName, File dir) throws ClassNotFoundException { Vector classes = new Vector(); File[] files = dir.listFiles(new FilenameFilter() { public boolean accept(File dir, String filename) { return filename.endsWith(".class"); } }); if (files!=null) { // directories without .class files may exist for (int j = 0; j < files.length; j++) { String className = packageName + "." + files[j].getName(); className = className.substring(0, className .lastIndexOf(".class")); classes.add(Class.forName(className)); } } return classes; } /** * Convert the package name into a relative directory path * @param packageName name of the package as 'ch.sahits.civ' * @return relativ directory to the package */ private String convertPackege(String packageName) { String sep = File.separator; return packageName.replace(".", sep); } /** * Retrive all classes of the indicated package and all subpackages. The package is searched in * all classpath directories that are directories * * @param packageName * name of the package as 'ch.sahits.civ' * @return Array of found classes * @throws ClassNotFoundException */ public Class[] getAllRecursive(String packageName) throws ClassNotFoundException { String packageDir = convertPackege(packageName); Vector classes = new Vector(); for (int i = 0; i < binDirs.length; i++) { packageDir = binDirs[i] + File.separator + packageDir; File dir = new File(packageDir); classes.addAll(extractClasses(packageName, dir)); if (dir.isDirectory()) { File[] sub = dir.listFiles(); for (int j = 0; j < sub.length; j++) { if (sub[j].isDirectory()) { Class[] rec = getAllRecursive(packageName + "." + sub[j].getName()); Vector temp = new Vector(rec.length); for (int k = 0; k < rec.length; k++) { temp.add(rec[k]); } classes.addAll(temp); } } } } Class[] result = new Class[classes.size()]; classes.copyInto(result); return result; } }