/* * Copyright (C) 2001, 2003 Eric D. Friedman (eric@hfriedman.rdsl.lmi.net) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * Created: Tue Aug 14 19:24:02 2001 */ package jde.util; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.StringTokenizer; /** * A class that represents a set of classpath entries for a project. * All projects include the entries found in boot.class.path and in * the various extension directories. Classpath entries are shared * across projects and so are not loaded/copied more than once. * * @author Eric D. Friedman * @version $Id: ProjectClasses.java,v 1.6 2003/06/18 10:12:53 paulk Exp $ */ class ProjectClasses { private String classPath; // the boot classpath is loaded at startup. private static ArrayList bootClassPathEntries = new ArrayList(); static { try { loadBootClassPathEntries(); } catch (IOException e) { e.printStackTrace(System.err); } // end of try-catch } // take a shallow clone of the boot classpath as the starting // point for the project classpath. private List classPathEntries = (List)bootClassPathEntries.clone(); /** * Creates a new ProjectClasses instance. * * @param classPath the project classpath * @exception IOException if an error occurs */ ProjectClasses(String classPath) throws IOException { this.classPath = classPath; String classPathEntry; File classPathFile; StringTokenizer st = new StringTokenizer(classPath, File.pathSeparator); while (st.hasMoreTokens()) { classPathEntry = st.nextToken(); classPathFile = new File(classPathEntry); if (classPathFile.exists()) { ClassPathEntry cpe = ClassPathEntry.instanceForEntry(classPathFile); if (cpe != null) { classPathEntries.add(cpe); } // end of if (cpe != null) } } } void reloadClasses() throws IOException { ClassPathEntry cpe; for (Iterator i = classPathEntries.iterator(); i.hasNext();) { cpe = (ClassPathEntry)i.next(); cpe.reload(); } } public String getClassPath() { return classPath; } /** * returns a list of fully qualified classnames matching an * unqualified name in all classpath entries for the project. * * @param unqualifiedName a String value * @return a List value * @exception IOException if an error occurs */ List getClassNames(String unqualifiedName) throws IOException { List rv = new ArrayList(); for (Iterator i = classPathEntries.iterator(); i.hasNext();) { ClassPathEntry cpe = (ClassPathEntry) i.next(); rv.addAll(cpe.getClassNames(unqualifiedName)); } return rv; } public String toString() { return classPathEntries.toString(); } public static void main (String[] args) throws Exception { System.out.println(new ProjectClasses(System.getProperty("java.class.path")).getClassNames(args[0])); } /** * loads the boot classpath entries. * * @exception IOException if an error occurs */ static void loadBootClassPathEntries() throws IOException { StringTokenizer st; File file; File[] extFiles; String bootClassPath = System.getProperty("sun.boot.class.path"); String extDirs = System.getProperty("java.ext.dirs"); st = new StringTokenizer(bootClassPath,File.pathSeparator); while (st.hasMoreTokens()) { file = new File(st.nextToken()); addToBootClassPath(file); } if (extDirs != null) { st = new StringTokenizer(extDirs,File.pathSeparator); // Iterate through extension directories while (st.hasMoreTokens()) { extFiles = new File(st.nextToken()).listFiles(); if (extFiles != null) { // Iterate through files added them to classPath for (int i = 0; i < extFiles.length; i++) { addToBootClassPath(extFiles[i]); } } } } } static void addToBootClassPath(File file) throws IOException { if (file.exists()) { ClassPathEntry entry = ClassPathEntry.instanceForEntry(file); if (null != entry) { bootClassPathEntries.add(new ImmutableClassPathEntry(entry)); } } // end of if (file.exists()) } }// ProjectClasses /* * $Log: ProjectClasses.java,v $ * Revision 1.6 2003/06/18 10:12:53 paulk * Fixed null pointer exception caused by insertion of null entries * into classPathEntries for files that are not class files or zip or jar files. * Thanks to Boyan Slavoff for reporting this problem. * * Revision 1.5 2002/02/21 12:24:32 jslopez * Adds method getClassPath. * * Revision 1.4 2001/10/17 04:03:37 paulk * Cosmetic changes to fit JDE coding style. * * */ // End of ProjectClasses.java