gcc/libjava/gnu/gcj/util/path/DirectoryPathEntry.java

137 lines
2.7 KiB
Java

// DirectoryPathEntry.java -- search path element for directories
/* 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 class DirectoryPathEntry extends PathEntry
{
final File dir;
final String base_canon;
public String toString () { return base_canon; }
DirectoryPathEntry (File f)
throws java.io.IOException
{
if (!f.isAbsolute ())
throw new IllegalArgumentException ();
dir = f;
base_canon = dir.getCanonicalPath ();
}
/*
* We maintain a cache of files, so that we
* can avoid many calls to stat(), which are
* very expensive.
*
* seen_cache contains (as keys) the directories
* which we have visited so far. The values are
* instances of CacheEntry, containing a time stamp,
* and a list of files in that directory.
*
*/
private Hashtable seen_cache = new Hashtable ();
private boolean in_cache (File f)
{
String rel_dir = f.getParent ();
CacheEntry ent;
if (rel_dir == null)
throw new IllegalArgumentException ();
ent = (CacheEntry) seen_cache.get (rel_dir);
if (ent == null)
{
ent = new CacheEntry (rel_dir);
seen_cache.put (rel_dir, ent);
}
if (ent.contains (f.getPath ()))
{
return true;
}
if ( ent.is_old () )
{
if (f.exists ())
{
seen_cache.remove (rel_dir);
return true;
}
else
{
ent.touch ();
}
}
return false;
}
URL getURL (String file) {
try {
File f = new File((new File (dir, file).getCanonicalPath ()));
if (! f.getCanonicalPath ().startsWith (base_canon))
throw new IllegalArgumentException (file);
if (in_cache (f))
return new URL ("file", "", f.getPath ());
else
return null;
} catch (IOException x) {
return null;
}
}
InputStream getStream (String file) {
try {
File f = new File((new File (dir, file)).getCanonicalPath ());
if (! f.getCanonicalPath ().startsWith (base_canon))
throw new IllegalArgumentException (file);
if (in_cache (f))
return new FileInputStream (f);
else
return null;
} catch (IOException x) {
return null;
}
}
byte[] getBytes (String file) {
File f = new File (dir, file);
try {
if (in_cache (f))
return readbytes (new FileInputStream (f),
(int) f.length ());
else
return null;
} catch (IOException x) {
return null;
}
}
}