diff options
Diffstat (limited to 'libjava/gnu/gcj/util/path/SearchPath.java')
-rw-r--r-- | libjava/gnu/gcj/util/path/SearchPath.java | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/libjava/gnu/gcj/util/path/SearchPath.java b/libjava/gnu/gcj/util/path/SearchPath.java new file mode 100644 index 00000000000..ffc2ca8d178 --- /dev/null +++ b/libjava/gnu/gcj/util/path/SearchPath.java @@ -0,0 +1,205 @@ +// SearchPath.java -- generic search path utility + +/* Copyright (C) 1999 Cygnus Solutions + + This file is part of libgcj. + +This software is copyrighted work licensed under the terms of the +Libgcj License. Please consult the file "LIBGCJ_LICENSE" for +details. */ + +/* Author: Kresten Krab Thorup <krab@gnu.org> */ + + +package gnu.gcj.util.path; + +import java.util.*; +import java.util.zip.*; +import java.io.*; +import java.net.*; + +final public class SearchPath { + + final static String path_seperator + = System.getProperty ("path.separator"); + final static char path_seperator_char + = path_seperator.charAt (0); + final static String file_seperator + = System.getProperty ("file.separator"); + final static char file_seperator_char + = file_seperator.charAt (0); + + private Vector path; + + /** + * Constructs a SearchPath object, given a system path. + * The system path is expected to be seperated by the string + * defined by the <code>path.seperator</code> property. + * (<code>":"</code> on unix, <code>;</code> on Windows, etc.). + * The path may contain names of directories, or names of + * .zip or .jar files. Elements that are neither of these + * are ignored. + * @param sys_path the search path + */ + + SearchPath (String sys_path) + { + StringTokenizer st = new StringTokenizer (sys_path, path_seperator); + init (st); + } + + /** + * Constructs a SearchPath object, given a Vector of + * <code>String</code>, <code>File</code> or <code>URL</code> + * objects. + * The path may contain names of directories, or names of + * .zip or .jar files. Elements that are neither of these + * are ignored. + * @param p the vector of search path elements + */ + + SearchPath (Vector p) + { + init (p.elements ()); + } + + public URL getURL (String element) + { + URL result; + + Enumeration e = path.elements (); + while (e.hasMoreElements ()) + { + PathEntry ent = (PathEntry) e.nextElement (); + + result = ent.getURL (element); + + if (result != null) + { + return result; + } + } + + return null; + } + + + public InputStream getStream (String element) + { + InputStream result; + + Enumeration e = path.elements (); + while (e.hasMoreElements ()) + { + PathEntry ent = (PathEntry) e.nextElement (); + + result = ent.getStream (element); + + if (result != null) + { + return result; + } + } + + return null; + } + + + public byte[] getBytes (String element) + { + byte[] result; + + Enumeration e = path.elements (); + while (e.hasMoreElements ()) + { + PathEntry ent = (PathEntry) e.nextElement (); + result = ent.getBytes (element); + if (result != null) + { + System.out.println ("loading " + ent + + "(" + element + ")"); + return result; + } + } + + return null; + } + + + + private void init (Enumeration st) + { + path = new Vector (); + while (st.hasMoreElements ()) + { + Object e = st.nextElement (); + + String elem; + File efile; + + if (e instanceof URL) + { + path.addElement (new URLPathEntry ((URL) e)); + continue; + } + + if (e instanceof File) + { + efile = (File) e; + elem = efile.getPath (); + } + + else if (e instanceof String) + { + elem = (String) e; + efile = new File (elem); + } + + else + throw new IllegalArgumentException (); + + // make sure it is absolute, so we won't get + // trouble if the cwd is changed... + if (! efile.isAbsolute ()) + efile = new File (efile.getAbsolutePath ()); + + if (efile.isDirectory ()) + { + try { + path.addElement(new DirectoryPathEntry (efile)); + } catch (IOException x) { + /* ignore for now */ + } + } + + else if (efile.isFile ()) + { + int ext = elem.lastIndexOf ('.'); + if (ext == -1) + continue; + + if (!elem.substring(ext+1).equalsIgnoreCase("zip")) + continue; + + ZipPathEntry zpe = null; + try { + zpe = new ZipPathEntry (efile); + } catch (ZipException zx) { + System.err.println ("SearchPath::ZipException"); + zpe = null; + } catch (MalformedURLException mx) { + System.err.println ("SearchPath::URLException"); + zpe = null; + } catch (IOException iox) { + System.err.println ("SearchPath::IOException"); + zpe = null; + } + if (zpe != null) path.addElement (zpe); + } + } + + } + + +} + |