Merged gcj-eclipse branch to trunk.

From-SVN: r120621
This commit is contained in:
Tom Tromey 2007-01-09 19:58:05 +00:00
parent c648dedbde
commit 97b8365caf
17478 changed files with 606493 additions and 100744 deletions

View file

@ -44,6 +44,14 @@ import gnu.classpath.VMStackWalker;
import java.io.InputStream;
import java.io.PrintStream;
import java.util.AbstractCollection;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Properties;
import java.util.PropertyPermission;
@ -97,6 +105,11 @@ public final class System
*/
public static final PrintStream err = VMSystem.makeStandardErrorStream();
/**
* A cached copy of the environment variable map.
*/
private static Map<String,String> environmentMap;
/**
* This class is uninstantiable.
*/
@ -118,6 +131,7 @@ public final class System
SecurityManager sm = SecurityManager.current; // Be thread-safe.
if (sm != null)
sm.checkPermission(new RuntimePermission("setIO"));
VMSystem.setIn(in);
}
@ -134,8 +148,7 @@ public final class System
{
SecurityManager sm = SecurityManager.current; // Be thread-safe.
if (sm != null)
sm.checkPermission(new RuntimePermission("setIO"));
sm.checkPermission(new RuntimePermission("setIO"));
VMSystem.setOut(out);
}
@ -221,7 +234,7 @@ public final class System
{
return VMSystem.currentTimeMillis();
}
/**
* <p>
* Returns the current value of a nanosecond-precise system timer.
@ -492,6 +505,60 @@ public final class System
return VMSystem.getenv(name);
}
/**
* <p>
* Returns an unmodifiable view of the system environment variables.
* If the underlying system does not support environment variables,
* an empty map is returned.
* </p>
* <p>
* The returned map is read-only and does not accept queries using
* null keys or values, or those of a type other than <code>String</code>.
* Attempts to modify the map will throw an
* <code>UnsupportedOperationException</code>, while attempts
* to pass in a null value will throw a
* <code>NullPointerException</code>. Types other than <code>String</code>
* throw a <code>ClassCastException</code>.
* </p>
* <p>
* As the returned map is generated using data from the underlying
* platform, it may not comply with the <code>equals()</code>
* and <code>hashCode()</code> contracts. It is also likely that
* the keys of this map will be case-sensitive.
* </p>
* <p>
* Use of this method may require a security check for the
* RuntimePermission "getenv.*".
* </p>
*
* @return a map of the system environment variables.
* @throws SecurityException if the checkPermission method of
* an installed security manager prevents access to
* the system environment variables.
* @since 1.5
*/
public static Map<String, String> getenv()
{
SecurityManager sm = SecurityManager.current; // Be thread-safe.
if (sm != null)
sm.checkPermission(new RuntimePermission("getenv.*"));
if (environmentMap == null)
{
List<String> environ = (List<String>)VMSystem.environ();
Map<String,String> variables = new EnvironmentMap();
for (String pair : environ)
{
String[] parts = pair.split("=");
if (parts.length == 2)
variables.put(parts[0], parts[1]);
else
variables.put(parts[0], "");
}
environmentMap = Collections.unmodifiableMap(variables);
}
return environmentMap;
}
/**
* Terminate the Virtual Machine. This just calls
* <code>Runtime.getRuntime().exit(status)</code>, and never returns.
@ -604,4 +671,419 @@ public final class System
return VMRuntime.mapLibraryName(libname);
}
/**
* This is a specialised <code>Collection</code>, providing
* the necessary provisions for the collections used by the
* environment variable map. Namely, it prevents
* querying anything but <code>String</code>s.
*
* @author Andrew John Hughes (gnu_andrew@member.fsf.org)
*/
private static class EnvironmentCollection
extends AbstractCollection<String>
{
/**
* The wrapped collection.
*/
protected Collection<String> c;
/**
* Constructs a new environment collection, which
* wraps the elements of the supplied collection.
*
* @param coll the collection to use as a base for
* this collection.
*/
public EnvironmentCollection(Collection<String> coll)
{
c = coll;
}
/**
* Blocks queries containing a null object or an object which
* isn't of type <code>String</code>. All other queries
* are forwarded to the underlying collection.
*
* @param obj the object to look for.
* @return true if the object exists in the collection.
* @throws NullPointerException if the specified object is null.
* @throws ClassCastException if the specified object is not a String.
*/
public boolean contains(Object obj)
{
if (obj == null)
throw new
NullPointerException("This collection does not support " +
"null values.");
if (!(obj instanceof String))
throw new
ClassCastException("This collection only supports Strings.");
return c.contains(obj);
}
/**
* Blocks queries where the collection contains a null object or
* an object which isn't of type <code>String</code>. All other
* queries are forwarded to the underlying collection.
*
* @param coll the collection of objects to look for.
* @return true if the collection contains all elements in the collection.
* @throws NullPointerException if the collection is null.
* @throws NullPointerException if any collection entry is null.
* @throws ClassCastException if any collection entry is not a String.
*/
public boolean containsAll(Collection<?> coll)
{
for (Object o: coll)
{
if (o == null)
throw new
NullPointerException("This collection does not support " +
"null values.");
if (!(o instanceof String))
throw new
ClassCastException("This collection only supports Strings.");
}
return c.containsAll(coll);
}
/**
* This returns an iterator over the map elements, with the
* same provisions as for the collection and underlying map.
*
* @return an iterator over the map elements.
*/
public Iterator<String> iterator()
{
return c.iterator();
}
/**
* Blocks the removal of elements from the collection.
*
* @return true if the removal was sucessful.
* @throws NullPointerException if the collection is null.
* @throws NullPointerException if any collection entry is null.
* @throws ClassCastException if any collection entry is not a String.
*/
public boolean remove(Object key)
{
if (key == null)
throw new
NullPointerException("This collection does not support " +
"null values.");
if (!(key instanceof String))
throw new
ClassCastException("This collection only supports Strings.");
return c.contains(key);
}
/**
* Blocks the removal of all elements in the specified
* collection from the collection.
*
* @param coll the collection of elements to remove.
* @return true if the elements were removed.
* @throws NullPointerException if the collection is null.
* @throws NullPointerException if any collection entry is null.
* @throws ClassCastException if any collection entry is not a String.
*/
public boolean removeAll(Collection<?> coll)
{
for (Object o: coll)
{
if (o == null)
throw new
NullPointerException("This collection does not support " +
"null values.");
if (!(o instanceof String))
throw new
ClassCastException("This collection only supports Strings.");
}
return c.removeAll(coll);
}
/**
* Blocks the retention of all elements in the specified
* collection from the collection.
*
* @param c the collection of elements to retain.
* @return true if the other elements were removed.
* @throws NullPointerException if the collection is null.
* @throws NullPointerException if any collection entry is null.
* @throws ClassCastException if any collection entry is not a String.
*/
public boolean retainAll(Collection<?> coll)
{
for (Object o: coll)
{
if (o == null)
throw new
NullPointerException("This collection does not support " +
"null values.");
if (!(o instanceof String))
throw new
ClassCastException("This collection only supports Strings.");
}
return c.containsAll(coll);
}
/**
* This simply calls the same method on the wrapped
* collection.
*
* @return the size of the underlying collection.
*/
public int size()
{
return c.size();
}
} // class EnvironmentCollection<String>
/**
* This is a specialised <code>HashMap</code>, which
* prevents the addition or querying of anything other than
* <code>String</code> objects.
*
* @author Andrew John Hughes (gnu_andrew@member.fsf.org)
*/
static class EnvironmentMap
extends HashMap<String,String>
{
/**
* Cache the entry set.
*/
private transient Set<Map.Entry<String,String>> entries;
/**
* Cache the key set.
*/
private transient Set<String> keys;
/**
* Cache the value collection.
*/
private transient Collection<String> values;
/**
* Constructs a new empty <code>EnvironmentMap</code>.
*/
EnvironmentMap()
{
super();
}
/**
* Constructs a new <code>EnvironmentMap</code> containing
* the contents of the specified map.
*
* @param m the map to be added to this.
* @throws NullPointerException if a key or value is null.
* @throws ClassCastException if a key or value is not a String.
*/
EnvironmentMap(Map<String,String> m)
{
super(m);
}
/**
* Blocks queries containing a null key or one which is not
* of type <code>String</code>. All other queries
* are forwarded to the superclass.
*
* @param key the key to look for in the map.
* @return true if the key exists in the map.
* @throws NullPointerException if the specified key is null.
*/
public boolean containsKey(Object key)
{
if (key == null)
throw new
NullPointerException("This map does not support null keys.");
if (!(key instanceof String))
throw new
ClassCastException("This map only allows queries using Strings.");
return super.containsKey(key);
}
/**
* Blocks queries using a null or non-<code>String</code> value.
* All other queries are forwarded to the superclass.
*
* @param value the value to look for in the map.
* @return true if the value exists in the map.
* @throws NullPointerException if the specified value is null.
*/
public boolean containsValue(Object value)
{
if (value == null)
throw new
NullPointerException("This map does not support null values.");
if (!(value instanceof String))
throw new
ClassCastException("This map only allows queries using Strings.");
return super.containsValue(value);
}
/**
* Returns a set view of the map entries, with the same
* provisions as for the underlying map.
*
* @return a set containing the map entries.
*/
public Set<Map.Entry<String,String>> entrySet()
{
if (entries == null)
entries = super.entrySet();
return entries;
}
/**
* Blocks queries containing a null or non-<code>String</code> key.
* All other queries are passed on to the superclass.
*
* @param key the key to retrieve the value for.
* @return the value associated with the given key.
* @throws NullPointerException if the specified key is null.
* @throws ClassCastException if the specified key is not a String.
*/
public String get(Object key)
{
if (key == null)
throw new
NullPointerException("This map does not support null keys.");
if (!(key instanceof String))
throw new
ClassCastException("This map only allows queries using Strings.");
return super.get(key);
}
/**
* Returns a set view of the keys, with the same
* provisions as for the underlying map.
*
* @return a set containing the keys.
*/
public Set<String> keySet()
{
if (keys == null)
keys = new EnvironmentSet(super.keySet());
return keys;
}
/**
* Associates the given key to the given value. If the
* map already contains the key, its value is replaced.
* The map does not accept null keys or values, or keys
* and values not of type {@link String}.
*
* @param key the key to map.
* @param value the value to be mapped.
* @return the previous value of the key, or null if there was no mapping
* @throws NullPointerException if a key or value is null.
* @throws ClassCastException if a key or value is not a String.
*/
public String put(String key, String value)
{
if (key == null)
throw new NullPointerException("A new key is null.");
if (value == null)
throw new NullPointerException("A new value is null.");
if (!(key instanceof String))
throw new ClassCastException("A new key is not a String.");
if (!(value instanceof String))
throw new ClassCastException("A new value is not a String.");
return super.put(key, value);
}
/**
* Removes a key-value pair from the map. The queried key may not
* be null or of a type other than a <code>String</code>.
*
* @param key the key of the entry to remove.
* @return the removed value.
* @throws NullPointerException if the specified key is null.
* @throws ClassCastException if the specified key is not a String.
*/
public String remove(Object key)
{
if (key == null)
throw new
NullPointerException("This map does not support null keys.");
if (!(key instanceof String))
throw new
ClassCastException("This map only allows queries using Strings.");
return super.remove(key);
}
/**
* Returns a collection view of the values, with the same
* provisions as for the underlying map.
*
* @return a collection containing the values.
*/
public Collection<String> values()
{
if (values == null)
values = new EnvironmentCollection(super.values());
return values;
}
}
/**
* This is a specialised <code>Set</code>, providing
* the necessary provisions for the collections used by the
* environment variable map. Namely, it prevents
* modifications and the use of queries with null
* or non-<code>String</code> values.
*
* @author Andrew John Hughes (gnu_andrew@member.fsf.org)
*/
private static class EnvironmentSet
extends EnvironmentCollection
implements Set<String>
{
/**
* Constructs a new environment set, which
* wraps the elements of the supplied set.
*
* @param set the set to use as a base for
* this set.
*/
public EnvironmentSet(Set<String> set)
{
super(set);
}
/**
* This simply calls the same method on the wrapped
* collection.
*
* @param obj the object to compare with.
* @return true if the two objects are equal.
*/
public boolean equals(Object obj)
{
return c.equals(obj);
}
/**
* This simply calls the same method on the wrapped
* collection.
*
* @return the hashcode of the collection.
*/
public int hashCode()
{
return c.hashCode();
}
} // class EnvironmentSet<String>
} // class System