summaryrefslogtreecommitdiff
path: root/sources/scalac/util/ClassPath.java
diff options
context:
space:
mode:
Diffstat (limited to 'sources/scalac/util/ClassPath.java')
-rw-r--r--sources/scalac/util/ClassPath.java161
1 files changed, 161 insertions, 0 deletions
diff --git a/sources/scalac/util/ClassPath.java b/sources/scalac/util/ClassPath.java
new file mode 100644
index 0000000000..b083c5485b
--- /dev/null
+++ b/sources/scalac/util/ClassPath.java
@@ -0,0 +1,161 @@
+/* ____ ____ ____ ____ ______ *\
+** / __// __ \/ __// __ \/ ____/ 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)
+ {
+ 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
+ */
+ protected 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 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;
+ }
+}