summaryrefslogblamecommitdiff
path: root/sources/scalac/util/ClassPath.java
blob: bd2a0665e9f672b329a745e2408c0a0450c66056 (plain) (tree)



































































                                                                             








                                                                 











































                                                                      
                                               






























                                                                            












                                                                                
















                                                          
/*     ____ ____  ____ ____  ______                                     *\
**    / __// __ \/ __// __ \/ ____/    SOcos COmpiles Scala             **
**  __\_ \/ /_/ / /__/ /_/ /\_ \       (c) 2002, LAMP/EPFL              **
** /_____/\____/\___/\____/____/                                        **
**                                                                      **
** $Id$
\*                                                                      */

package scalac.util;

import java.io.*;
import java.util.*;


public class ClassPath {

    /** the character separating files
     */
    protected static String FILE_SEP = File.separator;

    /** the separator in class path specifications
     */
    protected static String PATH_SEP =
        System.getProperty("path.separator");

    /** the default class path
     */
    public static String CLASS_PATH =
        System.getProperty("scala.class.path",
            System.getProperty("java.class.path"));

    /** the default source path
     */
    public static String SOURCE_PATH = null;

    /** the default boot class path
     */
    public static String BOOT_PATH =
        appendPath(appendPath("", System.getProperty("sun.boot.class.path")),
            System.getProperty("scala.boot.class.path")).substring(1);

    /** the default extension path
     */
    public static String EXTENSION_PATH =
        System.getProperty("java.ext.dirs");

    /** the various class path roots
     */
    protected String[] root;

    /** print searches in the class path
     */
    public boolean printSearch;


    /** classpath constructor
     */
    public ClassPath() {
        this(CLASS_PATH);
    }

    public ClassPath(String classpath) {
        this(classpath, SOURCE_PATH, BOOT_PATH, EXTENSION_PATH);
    }

    public ClassPath(String classpath, String sourcepath,
        String bootclasspath, String extdirs)
    {
        // replace first empty path in bootclasspath by BOOT_PATH
        if (!bootclasspath.equals(BOOT_PATH)) {
            String path = PATH_SEP + bootclasspath + PATH_SEP;
            int index = path.indexOf(PATH_SEP + PATH_SEP);
            if (index >= 0)
                bootclasspath =
                    path.substring(1, index + 1) + BOOT_PATH +
                    path.substring(index + 1, path.length() - 1);
        }
        String path = "";
        path = appendPath(path, bootclasspath);
        path = appendExtDirs(path, extdirs);
        path = appendPath(path, classpath);
        path = appendPath(path, sourcepath);
        root = parse(path.substring(1));
    }

    /** append an additional path
     */
    protected static String appendPath(String path, String addpath) {
        return addpath == null ? path : path + PATH_SEP + addpath;
    }

    /** append files from the extension directories
     */
    protected String appendExtDirs(String path, String extdirs) {
        if (extdirs != null) {
            extdirs += PATH_SEP;
            int length = extdirs.length();
            int i = 0;
            while (i < length) {
                int k = extdirs.indexOf(PATH_SEP, i);
                String dirname = extdirs.substring(i, k);
                String[] ext;
                if ((dirname != null) &&
                    (dirname.length() > 0) &&
                    ((ext = new File(dirname).list()) != null)) {
                    if (!dirname.endsWith(FILE_SEP))
                        dirname += FILE_SEP;
                    for (int j = 0; j < ext.length; j++)
                        if (ext[j].endsWith(".jar") ||
                            ext[j].endsWith(".zip"))
                            path = appendPath(path, dirname + ext[j]);
                }
                i = k + 1;
            }
        }
        return path;
    }

    /** parse a class path specification and return an array
     *  of existing class file locations
     */
    public static String[] parse(String path) {
        path += PATH_SEP;
        Vector components = new Vector();
        int i = 0;
        while (i < path.length()) {
            int j = path.indexOf(PATH_SEP, i);
            String subpath = path.substring(i, j);
            if (new File(subpath).exists())
                components.add(subpath);
            i = j + 1;
        }
        return (String[])components.toArray(
            new String[components.size()]);
    }

    /** find file with given name in class path and return an abstract
     *  file representation
     */
    public AbstractFile openFile(String name) throws FileNotFoundException {
        if (printSearch)
            System.out.println("looking for " + name);
        for (int i = 0; i < root.length; i++) {
            if (printSearch)
                System.out.println("  in " + root[i]);
            AbstractFile f = AbstractFile.open(root[i], name);
            if (f != null)
                return f;
        }
        throw new FileNotFoundException("file '" + name +
                                        "' not found in classpath");
    }

    public java.io.File openJavaFile(String name) throws FileNotFoundException {
        if (printSearch)
            System.out.println("looking for " + name);
        for (int i = 0; i < root.length; i++) {
            if (printSearch)
                System.out.println("  in " + root[i]);
            java.io.File f = new File(root[i], name);
	    if (f.exists()) return f;
        }
        throw new FileNotFoundException("file '" + name +
                                        "' not found in classpath");
    }

    public String[] components() {
        return root;
    }

    /** return a textual representation of this class path
     */
    public String toString() {
        if (root.length == 0)
            return "";
        else if (root.length == 1)
            return root[0];
        String path = root[0];
        for (int i = 1; i < root.length; i++)
            path += PATH_SEP + root[i];
        return path;
    }
}