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

@ -48,6 +48,15 @@ import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.PrintStream;
import java.util.AbstractCollection;
import java.util.ArrayList;
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;
@ -102,6 +111,11 @@ public final class System
public static final PrintStream err
= new PrintStream(new BufferedOutputStream(new FileOutputStream(FileDescriptor.err)), true);
/**
* A cached copy of the environment variable map.
*/
private static Map<String,String> environmentMap;
/**
* This class is uninstantiable.
*/
@ -393,6 +407,29 @@ public final class System
return SystemProperties.setProperty(key, value);
}
/**
* Remove a single system property by name. A security check may be
* performed, <code>checkPropertyAccess(key, "write")</code>.
*
* @param key the name of the system property to remove
* @return the previous value, or null
* @throws SecurityException if permission is denied
* @throws NullPointerException if key is null
* @throws IllegalArgumentException if key is ""
* @since 1.5
*/
public static String clearProperty(String key)
{
SecurityManager sm = SecurityManager.current; // Be thread-safe.
if (sm != null)
sm.checkPermission(new PropertyPermission(key, "write"));
// This handles both the null pointer exception and the illegal
// argument exception.
if (key.length() == 0)
throw new IllegalArgumentException("key can't be empty");
return SystemProperties.remove(key);
}
/**
* Gets the value of an environment variable.
*
@ -415,6 +452,59 @@ public final class System
return getenv0(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();
// FIXME
List<String> environ = new ArrayList<String>();
Map<String,String> variables = new EnvironmentMap();
for (String pair : environ)
{
String[] parts = pair.split("=");
variables.put(parts[0], parts[1]);
}
environmentMap = Collections.unmodifiableMap(variables);
}
return environmentMap;
}
/**
* Terminate the Virtual Machine. This just calls
* <code>Runtime.getRuntime().exit(status)</code>, and never returns.
@ -557,4 +647,382 @@ public final class System
* @see #getenv(String)
*/
static native String getenv0(String name);
/**
* 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)
*/
private 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();
}
/**
* 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;
}
/**
* 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